2016-11-19 64 views
0

我在更改控件上的动态资源样式时存在问题(例如它是日期选择器,但我想更改它以适用于很多不同的控件)。我有一个启用样式和一个禁用样式,残疾人样式基于启用样式。这是一种享受。我希望能够在点击按钮时改变样式(启用禁用,反之亦然),但经过一些搜索后,我所提供的代码无法正常工作。C#运行时更改WPF动态资源

这是在资源字典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消息= A 'DynamicResourceExtension' 不能被上 类型 '风格' 的 '支持算法FMP' 属性设置。 'DynamicResourceExtension'只能在DependencyObject的DependencyProperty上设置。
源= PresentationFramework堆栈跟踪: 在MS.Internal.Helper.CheckCanReceiveMarkupExtension(的MarkupExtension 的MarkupExtension,IServiceProvider的的ServiceProvider,DependencyObject的& targetDependencyObject,DependencyProperty的& targetDependencyProperty) 的InnerException:

这对我表明我不能使用基于样式,但即使我已将禁用的样式更改为包含已启用样式上的所有内容并删除了BasedOn标签,它仍然会失败。有没有人有任何想法,我错了?这是真正做一个人的螺母:(

+0

使其成为静态资源'BasedOn =“{StaticResource appDatePicker}”'。'已经覆盖基本设置,''DynamicResource'有不同的目的,它应该修复这个异常,但是另外一种方法,比如使用样式触发器,可能会更简单r – ASh

+0

因为这正是我所需要的,谢谢。 – BU00HA

回答

1

你实际上并不想改变资源使用参考触发器代替:如果你想IsEnabled属性的值以编程方式更改基础

​​

某些条件绑定到实现了INotifyPropertyChanged的支持属性

+0

axlj,这是完美的,但不是我想要做的。我将在未来使用它。谢谢你的帮助。 – BU00HA

+0

@ BU00HA这听起来像你可能会反对WPF被设计使用的方式。 (授予,如果它适合你,那就去做吧)。无论如何,这听起来像你想用你自己的'hasBeenClicked'属性来扩展datepicker控件。设置资源引用的方法很可能会产生未实现的副作用,您最终会在几个小时后尝试进行调试。 – axlj