【问题标题】:Set control Background color using Dynamic Resource in WPF?在 WPF 中使用动态资源设置控件背景颜色?
【发布时间】:2013-07-06 11:25:48
【问题描述】:

这是我的 XAML

<Grid.Resources>
            <SolidColorBrush x:Key="DynamicBG"/>
</Grid.Resources>
<Label name="MyLabel" Content="Hello" Background="{DynamicResource DynamicBG} />

所以我有两个问题:

Q1:现在如何在我的代码中将DynamicBG 键值设置为Red? (当窗口加载时,我想将其设置为红色)

Q2:这是应该如何使用动态资源的吗?

谢谢

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    要访问代码的Resource,必须在文件App.xaml中识别它们:

    <Application.Resources>
        <SolidColorBrush x:Key="DynamicBG" />
    </Application.Resources>
    

    XAML example

    <Grid>       
        <Label Name="MyLabel" 
               Content="Hello" 
               Background="{DynamicResource DynamicBG}" />
    
        <Button Content="Change color"
                Width="100" 
                Height="30" 
                Click="Button_Click" />
    </Grid>
    

    Resource 可以在表单的代码行中更改:

    Application.Current.Resources["MyResource"] = MyNewValue;
    

    例子:

    Code behind

    // using ContentRendered event
    private void Window_ContentRendered(object sender, EventArgs e)
    {
        SolidColorBrush MyBrush = Brushes.Aquamarine;
    
        // Set the value
        Application.Current.Resources["DynamicBG"] = MyBrush;         
    }
    
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        SolidColorBrush MyBrush = Brushes.CadetBlue;
    
        // Set the value
        Application.Current.Resources["DynamicBG"] = MyBrush;
    }
    

    原则,DynamicResources 是设计好的,所以可以更改。在哪里改变 - 这是开发人员的任务。对于Color,它是最常用的方法之一。请参阅MSDN,了解更多信息。

    P。 S.我推荐使用App.xaml,因为曾经有成功使用过StaticResource,但没有成功使用DynamicResource的情况(资源放在Window.Resources中)。但是在将资源移动到App.xaml 之后,一切都开始工作了。

    【讨论】:

      【解决方案2】:

      A1: 您应该将“DynamicBG”移动到窗口资源,然后您可以在Loaded 事件处理程序中使用Resources 属性:

      XAML:

      <Window x:Class="MyLabelDynamicResource.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              Title="MainWindow" Height="350" Width="525"
              Loaded="Window_Loaded">
          <Window.Resources>
              <SolidColorBrush x:Key="DynamicBG"/>
          </Window.Resources>
          <Grid>    
              <Label Name="MyLabel" Content="Hello" Background="{DynamicResource DynamicBG}" />
          </Grid>
      </Window>
      

      代码隐藏:

      public partial class MainWindow : Window
      {
          public MainWindow()
          {
              InitializeComponent();
          }
      
          private void Window_Loaded(object sender, RoutedEventArgs e)
          {
              this.Resources["DynamicBG"] = new SolidColorBrush(Colors.Red);
          }      
      }
      

      A2: 当您想在运行时更改属性时,您应该使用动态资源。

      【讨论】:

      • 感谢您抽出宝贵时间详细回答,可惜我只能选择一个答案。 +1 了
      【解决方案3】:

      A2:不。 要做你正在做的事情,最好使用数据绑定。在您的视图模型中有一个属性指示它是否已“加载”,然后使用合适的转换器将背景绑定到它,或使用触发器。 (如果实际加载的是 UI,则将属性添加到窗口。)动态资源用于主题和模板,在极少数情况下,StaticResource 查找发生得太早。

      【讨论】:

        猜你喜欢
        • 2011-01-07
        • 1970-01-01
        • 2015-07-29
        • 2010-09-14
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多