C#运行时更改WPF动态资源

时间:2016-11-19 14:13:31

标签: c# wpf xaml

我在控件上更改动态资源样式时出现问题(在示例中,它是一个日期选择器,但我想为很多不同的控件更改它)。我有一个启用的样式和一个用于禁用的样式,禁用的样式基于启用的样式。这是一种享受。我希望能够在单击按钮时更改样式(启用禁用,反之亦然),但经过一些搜索,我提出的代码,只是没有工作。

这是资源字典中的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     &#39; DynamicResourceExtension&#39;不能设置在&#39; BasedOn&#39;的财产     类型&#39;风格&#39;。 A&#39; DynamicResourceExtension&#39;只能设置为     DependencyObject的DependencyProperty     Source = PresentationFramework StackTrace:            在MS.Internal.Helper.CheckCanReceiveMarkupExtension(MarkupExtension     markupExtension,IServiceProvider serviceProvider,DependencyObject&amp;     targetDependencyObject,DependencyProperty&amp; targetDependencyProperty)     的InnerException:

  

这对我来说表明我不能使用基于样式的风格,但即使我更改了禁用的样式以包含启用的样式中的所有内容并删除了BasedOn标记,它仍然会失败。有没有人有任何想法我错了?这真的是做了一个坚果:(

1 个答案:

答案 0 :(得分:1)

您实际上并不想更改资源引用。改为使用触发器:

<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.Triggers>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground" Value="..."/>
        </Trigger>
    </Style.Triggers>
</Style>

如果要根据特定条件以编程方式更改IsEnabled属性的值,请绑定到实现INotifyPropertyChanged的后备属性。