【问题标题】: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 的全部意义所在。

标签: c# wpf xaml styles code-behind


【解决方案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 不会更改。
      • 如果您确定资源在此分配后不会改变,这样会更好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2012-03-25
      相关资源
      最近更新 更多