【发布时间】:2016-11-19 14:13:31
【问题描述】:
我在更改控件上的动态资源样式时遇到问题(在示例中它是一个日期选择器,但我想为许多不同的控件更改它)。我有一种启用的样式和一种禁用的样式,禁用的样式基于启用的样式。这是一种享受。我希望能够在单击按钮时更改样式(启用到禁用,反之亦然),但经过一番搜索,我想出的代码不起作用。
这是资源字典中的 XAML
<!--DatePicker Resource-->
<Style x:Key="appDatePicker" TargetType="{x:Type DatePicker}">
<Setter Property="FontFamily" Value="{Binding Source={StaticResource userSettings}, Path=Default.userFontFamily}" />
<Setter Property="FontSize" Value="{Binding Source={StaticResource userSettings}, Path=Default.userFontNormalSize}" />
<Setter Property="Height" Value="Auto" />
<Setter Property="MinWidth" Value="{Binding Source={StaticResource userSettings}, Path=Default.userControlWidth}" />
<Setter Property="Background" Value="{Binding Source={StaticResource userSettings}, Path=Default.userControlBackground}" />
<Setter Property="IsEnabled" Value="True"/>
</Style>
<!--DatePicker Disabled Resource-->
<Style x:Key="appDatePickerDisabled" TargetType="{x:Type DatePicker}" BasedOn="{DynamicResource appDatePicker}">
<Setter Property="IsEnabled" Value="False"/>
</Style>
这是将其更改为禁用样式的代码:
datepickerEDP.SetResourceReference(Control.StyleProperty, "appDatePickerDisabled");
对于启用的样式
datepickerEDP.SetResourceReference(StyleProperty, "appDatePicker");
运行此代码时遇到的错误是
System.Windows.Markup.XamlParseException 发生 HResult=-2146233087 LineNumber=0 LinePosition=0 Message=A 不能在“BasedOn”属性上设置“DynamicResourceExtension” 输入“样式”。 “DynamicResourceExtension”只能设置在 DependencyObject 的 DependencyProperty。
来源=PresentationFramework StackTrace: 在 MS.Internal.Helper.CheckCanReceiveMarkupExtension(MarkupExtension markupExtension, IServiceProvider serviceProvider, DependencyObject& targetDependencyObject, DependencyProperty & targetDependencyProperty) 内部异常:
这对我来说表明我不能使用基于样式,但即使我更改了禁用样式以包含启用样式中的所有内容并删除了 BasedOn 标记,它仍然会失败。有谁知道我哪里出错了?这真的很疯狂:(
【问题讨论】:
-
使其成为静态资源
BasedOn="{StaticResource appDatePicker}"。<Setter Property="IsEnabled" Value="False"/>已经覆盖了基本设置,'DynamicResource有不同的用途。它应该修复异常,但也许另一种方法(如使用样式触发器)会更简单 -
ASh 这正是我所需要的,谢谢。