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

本文关键字:WPF 插入 自定义控件 XAML 编辑器 | 更新日期: 2023-09-27 18:06:25

我有一个XAML主窗口,它包含一个页眉、一个中心区域和一个页脚(在一个网格中)。中央区域包含一个ContentControl,它被绑定(使用MVVMLight)。页眉/页脚总是相同的,所以没有问题。

进入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>

是否有办法为这些视图创建一个基类/自定义控件?所以我可以在xaml:

中写这样的东西
<basewindow>
    <leftpart>
        custom XAML for this view
    </leftpart>
    <rightpart>
        custom XAML for this view
    </rightpart>
</basewindow>

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

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

澄清您是否试图继承XAML中存在的视觉元素,就像您可以在WinForms中做的那样?如果是这样,就不能在WPF中这样做。在WPF中没有视觉继承。

现在,如果你不想继承视觉元素,这很容易。首先创建UserControlBase类并添加事件处理程序。请记住,这个基类不能与任何XAML相关联。代码只

public class MyUserControlBase : UserControl
{
    public MyUserControlBase()
    {
    }
    protected virtual void Button_Click(object sender, RoutedEventArgs e)
    {
    }
}

现在创建另一个具有xaml计数器部分的UserControl。现在需要将XAML中的根元素更改为基类,如下所示:

<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();
    }
}

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