在编辑器

时间:2015-08-05 14:07:37

标签: c# wpf xaml custom-controls

我有一个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的能力。或者这不可行?

1 个答案:

答案 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事件处理程序。这就是你需要做的一切。