【问题标题】:C# Runtime change WPF Dynamic ResourceC# 运行时更改 WPF 动态资源
【发布时间】: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}"&lt;Setter Property="IsEnabled" Value="False"/&gt; 已经覆盖了基本设置,'DynamicResource 有不同的用途。它应该修复异常,但也许另一种方法(如使用样式触发器)会更简单
  • ASh 这正是我所需要的,谢谢。

标签: c# wpf xaml


【解决方案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 的支持属性。

【讨论】:

  • axlj,这很完美,但不适合我想做的事情。我将在未来使用它。感谢您的帮助。
  • @BU00HA 听起来您可能正在反对 WPF 的设计使用方式。 (当然,如果它适合你,那就去吧)。无论如何,听起来您想使用自己的“hasBeenClicked”属性扩展日期选择器控件。设置资源引用的方法可能会产生未意识到的副作用,您最终会在数小时后尝试调试。
猜你喜欢
  • 2010-09-28
  • 2014-09-25
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多