Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#运行时更改WPF动态资源_C#_Wpf_Xaml - Fatal编程技术网

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

C#运行时更改WPF动态资源,c#,wpf,xaml,C#,Wpf,Xaml,我在更改控件上的动态资源样式时遇到了一个问题(在示例中,它是一个日期选择器,但我想为许多不同的控件更改它)。我有一个用于启用的样式和一个用于禁用的样式,禁用的样式基于启用的样式。这是一种享受。我希望能够在单击按钮时更改样式(启用为禁用,反之亦然),但经过一些搜索后,我找到的代码就不起作用了 这是资源字典中的XAML <!--DatePicker Resource--> <Style x:Key="appDatePicker" TargetType="{x:Type DatePi

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

这是资源字典中的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(StyleProperty, "appDatePicker");
运行此代码时出现的错误是

发生System.Windows.Markup.XamlParseException HResult=-2146233087 LineNumber=0 LinePosition=0 Message=A 无法在的“BasedOn”属性上设置“DynamicResourceExtension” 键入“样式”。“DynamicResourceExtension”只能在上设置 DependencyObject的DependencyProperty。
Source=PresentationFramework堆栈跟踪: 在MS.Internal.Helper.CheckCanReceiveMarkupExtension(MarkupExtension markupExtension,IServiceProvider服务提供程序,DependencyObject& targetDependencyObject、DependencyProperty和targetDependencyProperty) 内部异常:


这对我来说意味着我不能使用基于样式,但即使我更改了禁用的样式以包括启用样式上的所有内容并删除了BasedOn标记,它仍然会失败。有人知道我哪里出了问题吗?这实际上是在做一件事:(

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

<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

的支持属性,使其成为静态资源
BasedOn=“{StaticResource appDatePicker}”
已经覆盖了基本设置,
'DynamicResource
有不同的用途。它应该可以修复异常,但可能使用样式触发器之类的另一种方法会更简单。这正是我所需要的,谢谢。axlj,这很完美,但不是我想要做的。不过,我以后会使用它。T谢谢你的帮助。@BU00HA听起来你可能在违背WPF的设计使用方式。(当然,如果它对你有用,那就去吧)。在任何情况下,听起来您都希望使用自己的“hasBeenClicked”属性扩展datepicker控件。设置资源引用的方法可能会产生未实现的副作用,您最终会在数小时后尝试调试。
<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>