如何将完全定义的控件作为WPF中的资源引用?

时间:2010-09-21 16:03:18

标签: .net wpf xaml resources

我知道我可以参考样式&资源字典中的模板,我大量使用它们。但完全控制呢?

我可以在app.xaml中将一个完全定义的WPF控件(如按钮)声明为资源。例如,定义按钮的app.xaml文件将包含以下内容:

<Button x:Key="HelpButton" Content="?" />

但是如何在用户控件的xaml标记中引用它以便呈现按钮?

编辑:
回答“你为什么要这样做?”的问题。我同意按钮不是一个很好的例子(它只是一个很容易描述)。

你在app.xaml中声明并希望在多个xaml文件中使用的多边形(不是控件,我知道)怎么样?

3 个答案:

答案 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类的实例:

  • 将实例设置为ContentControl或派生控件的Content属性,或
  • 该实例是使用ItemsControl显示的集合中的许多项之一。

当我说'在范围'时,我的意思是DataTemplate是在可访问的控件层次结构中的某个ResourceDictionary中定义的;即Application.Resources,Window.Resources等,如果目标控件(ContentControl或ItemsControl)在其中托管,则降至Grid.Resources的级别。

当然,您也可以指定不带TargetType的DataTemplate,而是使用x:Key,并通过手动引用该Key来使用它;例如myListBox.ItemTemplate={StaticResource myKey}

相关问题