【问题标题】:How can you reference a fully defined control as a resource within WPF?如何将完全定义的控件引用为 WPF 中的资源?
【发布时间】:2010-09-21 16:03:18
【问题描述】:

我知道我可以从资源字典中引用样式和模板,并且我会大量使用它们。但是完整的控制呢?

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

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

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

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

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

【问题讨论】:

  • 您可以通过将多边形路径数据声明为字符串资源,然后根据需要创建引用该资源的多边形来绕过多边形的限制 - 仅比使用成熟样式稍微简单一些。

标签: .net wpf xaml resources


【解决方案1】:

你不能,老实说,我不确定你为什么要这样做。该按钮是one按钮,意味着它只能在一个地方(一次);鉴于此,在您需要的每个地方定义一个新按钮是有意义的。正如您已经发现的那样,这就是模板资源的用途。

(当我说你不能时,我的意思是它在普通 XAML 中不受支持;可以想象你可以在返回按钮的类中实现 IValueConverter,并在 XAML 中将其绑定到内容的内容控件。当然,您可以根据需要使用代码以编程方式从不同的容器中添加和删除按钮。这似乎都不是一个好选择。)

【讨论】:

  • 只是为了澄清——一个视觉元素只能有一个父元素。如果它被引用两次(如果有可能的话)会引发运行时异常。
【解决方案2】:

作为 Ben M. 回答的旁注:

可以以这种方式使用某些视觉效果 - 例如从 ToolTip 继承的东西 - 但它仅在 ToolTip 属性中使用时才有效:

<UserControl.Resources>
    <local:MyToolTip x:Key="ToolTip"/>
<UserControl.Resources>
<Button ToolTip="{StaticResource ToolTip}"/>

这种方式可行,但您确实应该使用样式来做这些事情。

【讨论】:

    【解决方案3】:

    唯一有意义的可能性是在 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,而是使用x:Key 来指定DataTemplate,并通过手动引用该Key 来使用它;例如myListBox.ItemTemplate={StaticResource myKey}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多