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

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 不会更改。 如果您确定资源在此分配后不会改变,这样会更好。

以上是关于如何在代码中分配动态资源样式?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用指针在另一个函数中分配数组

如何在计算方法和mapState中分配数组中的动态参数

如何在 C++ 中分配一个大的动态数组?

如何使用 Ruby 块在厨师食谱中分配变量

如何解决类中分配端点上的错误请求?

如何在 C++ 中分配一个二维指针数组