在编辑器中将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中存在的视觉元素,就像您可以在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事件处理程序。这就是你所需要做的。