我知道我可以参考样式&资源字典中的模板,我大量使用它们。但完全控制呢?
我可以在app.xaml中将一个完全定义的WPF控件(如按钮)声明为资源。例如,定义按钮的app.xaml文件将包含以下内容:
<Button x:Key="HelpButton" Content="?" />
但是如何在用户控件的xaml标记中引用它以便呈现按钮?
编辑:
回答“你为什么要这样做?”的问题。我同意按钮不是一个很好的例子(它只是一个很容易描述)。
你在app.xaml中声明并希望在多个xaml文件中使用的多边形(不是控件,我知道)怎么样?
答案 0 :(得分:3)
你不能,而且说实话,我不确定你为什么要这样做。该按钮是一个按钮,这意味着它只能在一个地方(一次);鉴于此,在您需要的每个地方定义一个新按钮是有意义的。正如您已经发现的那样,这就是模板资源的用途。
(当我说你做不到时,我的意思是它在普通的XAML中不受支持;可以想象你可以在返回按钮的类中实现IValueConverter
,并将它在XAML中绑定到内容一个内容控件。当然,你可以根据需要使用代码以不同的容器编程方式添加和删除按钮。这两个看起来都不是一个很好的选择。)
答案 1 :(得分:0)
作为Ben M.回答的旁注:
有些视觉效果可以这种方式使用 - 例如从ToolTip继承的东西 - 但它只在ToolTip属性中使用时才有效:
<UserControl.Resources>
<local:MyToolTip x:Key="ToolTip"/>
<UserControl.Resources>
<Button ToolTip="{StaticResource ToolTip}"/>
这种方法有效,但你真的应该使用样式来做这些事情。
答案 2 :(得分:0)
唯一有意义的是将一些控件合并到DataTemplate中并使用它。 DataTemplate'装扮'任何对象,可以包括完整控件;设计用户控件并使用DataTemplates组合它们实际上很常见;例如,您可以像这样定义DataTemplate:
<DataTemplate TargetType="{x:Type viewmodels:MyViewModel}">
<Button Command={Binding MyCommand} Content={Binding MyCaption} />
</DataTemplate>
假设MyViewModel选项包含一个名为MyCaption的字符串属性和一个名为MyCommand的ICommand属性,DataTemplate将自动使用(如果在范围内定义),以便在以下情况下可视地显示MyViewModel类的实例:
当我说'在范围'时,我的意思是DataTemplate是在可访问的控件层次结构中的某个ResourceDictionary中定义的;即Application.Resources,Window.Resources等,如果目标控件(ContentControl或ItemsControl)在其中托管,则降至Grid.Resources的级别。
当然,您也可以指定不带TargetType的DataTemplate,而是使用x:Key,并通过手动引用该Key来使用它;例如myListBox.ItemTemplate={StaticResource myKey}
。