如何在.cs中统一动态修改xaml中style资源定义的样式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在.cs中统一动态修改xaml中style资源定义的样式相关的知识,希望对你有一定的参考价值。

参考技术A 1.WPF样式 类似于Web应用程序中的CSS,在WPF中可以为控件定义统一的样式(Style)。样式属于资源的一种,例如为Button定义统一的背景颜色和字体: Button A 在Style中定义的属性及值,影响到Window中的所有类型为Button的控件的样式 这种样式本回答被提问者采纳

如何在代码中分配动态资源样式?

【中文标题】如何在代码中分配动态资源样式?【英文标题】:How to assign a dynamic resource style in code? 【发布时间】:2010-12-17 19:09:04 【问题描述】:

我想在 XAML 中生成与此等效的代码:

<TextBlock
Text="Title:"
Width="Binding FormLabelColumnWidth"
Style="DynamicResource FormLabelStyle"/>

我可以做文字和宽度,但是如何将动态资源分配给样式:

TextBlock tb = new TextBlock();
            tb.Text = "Title:";
            tb.Width = FormLabelColumnWidth;
            tb.Style = ???

【问题讨论】:

正如其他人在这里指出的那样,您标记为正确的答案实际上并没有解决问题所提出的问题。这里还有另一个答案。您应该考虑相应地更改您的答案,因为有些人只阅读标记的答案而没有其他内容,他们会错过正确的信息,这就是 SO 的全部意义所在。 【参考方案1】:

Application.Current.Resources.TryGetValue("ResourceKey", out var value)

【讨论】:

【参考方案2】:

如果您想要真正的 DynamicResource 行为,您应该使用FrameworkElement.SetResourceReference - 即在资源更改时更新目标元素。

tb.SetResourceReference(Control.StyleProperty, "FormLabelStyle")

【讨论】:

如果您正在处理嵌套字典,这绝对是您的最佳选择!【参考方案3】:

最初的问题是如何使其成为动态的,这意味着如果资源更改,控件将更新。上面的最佳答案使用了 SetResourceReference。对于 Xamarin 框架,这是不可用的,但 SetDynamicResource 是可用的,它完全按照原始海报的要求进行。简单的例子

        Label title = new Label();
        title.Text = "Title";
        title.SetDynamicResource(Label.TextColorProperty, "textColor");
        title.SetDynamicResource(Label.BackgroundColorProperty, "backgroundColor");

现在调用:

        App.Current.Resources["textColor"] = Color.AliceBlue;
        App.Current.Resources["backgroundColor"] = Color.BlueViolet;

以这种方式使所有使用资源的控件的属性发生变化。这应该适用于任何属性。

【讨论】:

【参考方案4】:

这应该可行:

tb.SetValue(Control.StyleProperty, "FormLabelStyle");

【讨论】:

这个方法和SetResourceReference有什么区别? 这相当于tb.Style = "FormLabelStyle"。这就是 CLR 包装器在内部执行的操作。 这会抛出一个ArgumentException: 'FormLabelStyle' is not a valid value for property 'Style'. 如果你使用等效的tb.Style = "FormLabelStyle";,语义是相同的(CLR 包装器属性在内部调用相同的代码),但它在编译时失败因为严格的类型检查(这很好)。【参考方案5】:

你可以试试:

tb.Style = (Style)FindResource("FormLabelStyle");

享受吧!

【讨论】:

von Samuel 的答案更好,因为它相当于 XAML 中的 DynamicResource,而您的答案将 tb.Style 更改为资源“FormLabelStyle”的当前值。但是,当资源“FormLabelStyle”更改时,tb.Style 不会更改。 如果您确定资源在此分配后不会改变,这样会更好。

以上是关于如何在.cs中统一动态修改xaml中style资源定义的样式的主要内容,如果未能解决你的问题,请参考以下文章

如何在代码中分配动态资源样式?

wpf中资源文件字典如何使它也拥有cs文件

动态加载资源字典文件到wpf应用程序会出错

WPF 中.XAML文件如何读取资源文件?

WPF中是不是只能通过改代码来修改Style?

从 XAML 中的 *.resx 文件中获取值