在代码中设置静态资源

24

我在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} 有关。有更好的方法来做到这一点吗?

4个回答

29

一个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”在命名空间“http://schemas.microsoft.com/client/2007”中不存在。” - Arn Vanhoutte
尝试使用Application.FindResource - Patrick Hofman
我也尝试过了。还有App.FindResource。输出只显示构建失败的错误。错误是:'System.Windows.Application'不包含“FindResource”的定义。 - Arn Vanhoutte
尝试将该代码放置在 Window.xaml.cs 类中。 - Patrick Hofman
同样的问题。我认为 Windows Phone 没有 FindResource 函数。因此我使用了 Application.Current.Resources。 - Arn Vanhoutte
显示剩余14条评论

12
为什么要修改样式而不是直接设置所选StackPanel的Background属性?因为“本地值”比“样式设定器”具有更高的优先级,所以您从代码后台写入Background的值将被使用。
意味着: (1) 给你的StackPanel起一个名称 x:Name="spBla" (2) 将Brush分配给spBla的背景(例如:spBla.Background=Application.Current.Resources["styleRed"] as SolidColorBrush;
您可以在这里了解有关值优先级的更多信息:http://msdn.microsoft.com/en-us/library/ms743230(v=vs.110).aspx

2
因为我在不同的视图中有很多堆栈面板。所以,我可以将想要更改的那些面板分配给特定的样式,然后更改该样式,而无需更改它们所有。 - Arn Vanhoutte

1
资源
    <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;
    }

0

如果我理解正确的话,你想要设置一种样式,使你只能更改特定的堆栈面板,而不必设置全部。试试这个建议(注意:这只是一个建议,我没有测试过,但希望它是正确的方向)

<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。我只是建议,还没有测试过。这将为你提供一个背景绑定,并为那些你没有设置背景颜色的stackpanel提供回退值。让我知道这是否对你有用 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接