【问题标题】:What's the best way to give a dependency property a default value from a resource dictionary从资源字典中为依赖属性提供默认值的最佳方法是什么
【发布时间】:2019-05-16 15:02:41
【问题描述】:

我想创建一个 WPF 用户控件(或自定义控件)。此控件的用户应该能够重新模板化此控件的某个部分。为此,我创建了一个名为“SubTemplate”的依赖属性。

Public Shared ReadOnly SubTemplateProperty As DependencyProperty =
    DependencyProperty.Register("SubTemplate", GetType(DataTemplate), GetType(MyControl), New FrameworkPropertyMetadata(Nothing))

当然,当用户没有提供自己的模板时,应该使用默认模板。但是如何将这个默认值赋予依赖属性呢?

我想在 XAML 中定义这个默认模板(可能在资源字典中,也可能在 Themes\Generic.xaml 中?)

有没有办法将Nothing 默认值与资源字典中的模板进行交换?

或者我是否必须在我的控件的构造函数中设置默认值(仍然不知道如何从代码后面的资源字典中访问命名模板,FindResource 似乎不起作用或者我'我用错了)。

或者我是否必须设置绑定的TargetNullValue,以便将模板添加到控件的重新模板化部分?

现在我只是在我的控件的默认样式中设置了“SubTemplate”属性,但是如果用户重新设置了整个控件的样式并且忘记提供“SubTemplate”,那么它将是Nothing

【问题讨论】:

  • 以控件的默认样式进行。如果用户重新设计了整个控件的样式并将其弄得一团糟,那是你无法控制的。
  • 您不能只在资源字典中使用模板或数据模板吗?他们想要不同的 UI,他们在自己的资源字典中定义了一个新模板,其目标键与您的默认模板相同。
  • 呃……你的意思是 wpf 中使用的标准机制,通过它的 Type 键将控件链接到它的模板?
  • @Andy 我熟悉隐式数据模板和默认样式。没有隐式 ControlTemplate 之类的东西,AFAIK。这里“子模板”的数据类型是什么?无论如何,显然我误解了你。扎了它。
  • 公平点。我以为他那里有东西。

标签: wpf


【解决方案1】:

有没有办法用资源字典中的模板交换Nothing 默认值?

如果您将默认的DataTemplate 添加到您的App.xaml 文件中,这应该可以工作:

Public Shared ReadOnly SubTemplateProperty As DependencyProperty =
DependencyProperty.Register("SubTemplate", GetType(DataTemplate), GetType(MyControl), New FrameworkPropertyMetadata(Application.Current.Resources("KeyOfTemplate")))

如果您想对事物进行更多控制,您可以编写一些查找模板的代码,例如在控件的OnApplyTemplate 方法中。您可能想从其他地方获取它,检查它是否确实存在,等等。

【讨论】:

  • 如果我的控件在控件库中,那么就没有Application.xaml(至少不在我的库中)。
  • @Nostromo:不,当然不是。然后,您需要编写一些代码来找到模板所在的任何位置。
  • 所以没有内置方法可以从“Themes\Generic.xaml”中获取命名资源?
  • @Nostromo:只需创建一个新的ResourceDictionary 对象并设置其Uri 属性:new ResourceDictionary() { Source = new Uri("pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml") }。然后,您可以照常访问其任何资源。但是没有静态属性可以让您访问 generic.xaml 中的资源。
  • 我会尝试在我的控件的构造函数中使用它,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多