在编辑器中将 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 事件处理程序。这就是您需要做的。
我有一个 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 事件处理程序。这就是您需要做的。