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

我想在代码中生成与 XAML 中相同的内容:

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

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

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

这应该会奏效:

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

你可以试试:

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

好好享受吧!

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

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

最初的问题是如何使其具有动态性,这意味着如果资源发生更改,控件将进行更新。上面的最佳答案使用了 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;

以这种方式使用资源会导致所有控件的属性发生更改。这对任何属性都适用。

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