我有一个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的能力。或者这不可行?
答案 0 :(得分:1)
澄清一下,您是否尝试继承XAML中存在的可视元素,就像在WinForms中一样?如果是这样,你不能在WPF中这样做。 WPF中没有Visual继承。
现在,如果你不想继承视觉元素,那很容易。首先创建UserControlBase类并添加事件处理程序。请记住,此基类不能与任何XAML关联。仅限代码
public class MyUserControlBase : UserControl
{
public MyUserControlBase()
{
}
protected virtual void Button_Click(object sender, RoutedEventArgs e)
{
}
}
现在创建另一个具有xaml计数器部分的UserControl。现在,您需要将XAML中的根elemtn更改为基类,如下所示:
<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事件处理程序。这就是你需要做的一切。