在编辑器中将 XAML 插入到 WPF 自定义控件中

Insert XAML into WPF custom control in the editor

我有一个 XAML 主 window,其中包含页眉、中心区域和页脚(在网格中)。中心区域包含一个 ContentControl,它被设置为抛出一个绑定(使用 MVVMLight)。 header/footer 总是一样的,所以没有问题。

进入 ContentControl 的部分总是非常相似,它们是 WPF 用户控件,左侧部分包含信息,右侧部分至少有一个 OK 和 BACK 按钮。

这些是视图模型及其视图:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="2*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid Grid.Column="0">
        <TextBlock Text="this changes and contains other controls too" />            
    </Grid>
    <Grid Grid.Column="1">
        <!-- more buttons and statuses-->
        <Button Content="Back" Margin="5" Height="30" />
        <Button Content="Ok" Margin="5" Height="30" />
    </Grid>
</Grid>

有没有办法为这些视图创建基础 class/custom 控件? 这样我就可以在我的 xaml 中写这样的东西:

<basewindow>
    <leftpart>
        custom XAML for this view
    </leftpart>
    <rightpart>
        custom XAML for this view
    </rightpart>
</basewindow>

然后我可以将每个视图中现在存在的重复代码删除到基础 class,同时仍然可以在编辑器中编写我的 xaml。或者这不可行?

澄清一下,您是否正在尝试继承存在于 XAML 中的视觉元素,就像您在 WinForms 中所做的那样?如果是这样,您不能在 WPF 中执行此操作。 WPF 中没有视觉继承。

现在,如果您不想继承视觉元素,那很容易。首先创建您的 UserControlBase class 并添加您的事件处理程序。请记住,此基数 class 不能与任何 XAML 关联。仅代码

public class MyUserControlBase : UserControl
{
    public MyUserControlBase()
    {

    }

    protected virtual void Button_Click(object sender, RoutedEventArgs e)
    {

    }
}

现在创建另一个具有 xaml 对应部分的 UserControl。现在您需要将 XAML 中的根元素更改为您的基础 class,如下所示:

<local:MyUserControlBase x:Class="WpfApplication7.MyUserControl"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:local="clr-namespace:WpfApplication7">

<Grid>
   <Button Click="Button_Click">My Button</Button>
</Grid>
</local:MyUserControlBase>

别忘了背后的代码:

public partial class MyUserControl : MyUserControlBase
{
    public MyUserControl()
    {
        InitializeComponent();
    }
}

注意派生用户控件中的按钮正在调用我们在基 class 中定义的 Button_Click 事件处理程序。这就是您需要做的。