如何在代码中分配动态资源样式?
Posted
技术标签:
【中文标题】如何在代码中分配动态资源样式?【英文标题】: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 不会更改。 如果您确定资源在此分配后不会改变,这样会更好。以上是关于如何在代码中分配动态资源样式?的主要内容,如果未能解决你的问题,请参考以下文章