【问题标题】:Set static resource in code在代码中设置静态资源
【发布时间】:2015-01-22 06:46:40
【问题描述】:

我的App.xaml 文件中有一些样式:

<SolidColorBrush x:Key="styleBlue" Color="#FF4B77BE"/>
<SolidColorBrush x:Key="styleRed" Color="#FFF64747"/>
<SolidColorBrush x:Key="styleOrange" Color="#FFF89406"/>
<SolidColorBrush x:Key="styleGreen" Color="#FF1BBC9B"/>
<SolidColorBrush x:Key="styleYellow" Color="#FFF9BF3B"/>

<Style x:Key="stackpanelBackground" TargetType="StackPanel">
    <Setter Property="Background" Value="{StaticResource styleBlue}"/>
</Style>

我想更改我的mainpage.xaml.cs 代码中的BackgroundProperty

我试过用这个:

Style style = Application.Current.Resources["stackpanelBackground"] as Style;          
style.Setters.SetValue(StackPanel.BackgroundProperty, "{StaticResource styleRed}");

但是我遇到了一个灾难性的失败异常。我认为这与{StaticResource styleRed} 有关。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c# wpf xaml staticresource app.xaml


    【解决方案1】:

    StaticResource 是静态的。应用程序编译完成后,您将无法更改它们。

    为此,有DynamicResource

    DynamicResource 将在初始编译期间创建一个临时表达式,从而推迟对资源的查找,直到实际需要请求的资源值才能构造对象。

    还请注意,您可以使用FindResource 更好地找到对其他资源的引用。尝试这样的事情(完整的工作示例):

    MainPage.xaml:

    <Window.Resources>
        <Color R="255" x:Key="styleRed" />
        <Style x:Key="abc" TargetType="StackPanel">
            <Setter Property="Background" Value="Blue" />
        </Style>
    </Window.Resources>
    

    MainPage.xaml.cs:

    Style style = this.FindResource("abc") as Style;
    var r = this.FindResource("styleRed");
    
    foreach (Setter s in style.Setters)
    {
        if (s.Property == StackPanel.BackgroundProperty)
        {
            s.Value = r;
        }
    }
    

    【讨论】:

    • 我尝试使用 DynamicResource 但它显示“名称“DynamicResource”不存在于命名空间“schemas.microsoft.com/client/2007"”中。
    • @ArnVanhoutte:查看编辑。这有帮助吗?运行项目时,Visual Studio 的 Output 窗格中是否有任何信息?
    • 我尝试在您的编辑中使用该方法,但没有成功。它无法解析 FindResource
    • @ArnVanhoutte:那就试试Application.FindResource
    • 也试过了。还有 App.FindResource。输出只是显示它未能构建。错误是这样的:“System.Windows.Application”不包含“FindResource”的定义
    【解决方案2】:

    为什么要修改样式而不是直接设置目标StackPanelBackground-Property?由于“本地值”的优先级高于“样式设置器”,因此将使用您从后面的代码写入 Background 的值

    意思是:

    (1) 为您的堆栈面板命名x:Name="spBla"

    (2) 将画笔分配给spBlaBackground(类似于spBla.Background=Application.Current.Resources["styleRed"] as SolidColorBrush;

    您可以在此处了解有关值优先级的更多信息:

    http://msdn.microsoft.com/en-us/library/ms743230(v=vs.110).aspx

    【讨论】:

    • 因为我在不同的视图中有很多堆栈面板。因此,我可以将要更改的样式分配给特定样式,然后更改该样式,而不是全部更改。
    【解决方案3】:

    如果我理解正确,您希望设置一种仅允许您更改特定堆栈面板的样式,因此您不必全部设置它们。试试这个建议(注意:这是一个建议,我没有测试过,但希望它朝着正确的方向发展)

    <SolidColorBrush x:Key="styleBlue" Color="#FF4B77BE"/>
    <SolidColorBrush x:Key="styleRed" Color="#FFF64747"/>
    <SolidColorBrush x:Key="styleOrange" Color="#FFF89406"/>
    <SolidColorBrush x:Key="styleGreen" Color="#FF1BBC9B"/>
    <SolidColorBrush x:Key="styleYellow" Color="#FFF9BF3B"/>
    
    <Style x:Key="stackpanelBackground" TargetType="StackPanel">
        <Setter Property="Background" Value="{Binding Background, FallbackValue={StaticResource styleBlue}}"/>
    </Style>
    

    或者尝试 TemplateBinding 而不是 Binding,就像我说的那样,这是一个建议,我还没有测试过。这将为您提供背景绑定,以及您尚未为其设置背景颜色的堆栈面板的后备值。让我知道这对你有什么作用或是否对你有用:)

    【讨论】:

      【解决方案4】:

      xaml 资源

          <Window.Resources>
              <LinearGradientBrush x:Key="GrayBlueGardientBrush"  
                                      StartPoint="0,0" EndPoint="1,1">
                  <GradientStop Color="DarkCyan" Offset="0"/>
                  <GradientStop Color="#CCCCFF" Offset="0.5"/>
                  <GradientStop Color="DarkCyan" Offset="1"/>
              </LinearGradientBrush>
          </Window.Resources>
      

      CS

          private void Button_Click(object sender, RoutedEventArgs e)
          {
              var r = this.FindResource("GrayBlueGardientBrush");
              (sender as Button).Background = r as LinearGradientBrush;
          }
      

      【讨论】:

        猜你喜欢
        • 2016-08-18
        • 1970-01-01
        • 2015-01-11
        • 2011-05-21
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-17
        相关资源
        最近更新 更多