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>

我想更改BackgroundProperty我的mainpage.xaml.cs.

我尝试使用这个:

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

但我得到一个灾难性的失败异常。我认为这与{StaticResource styleRed}. 有一个更好的方法吗?

4

4 回答 4

28

AStaticResource是静态的。一旦应用程序编译完成,您就无法更改它们。

为此,有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;
    }
}
于 2014-11-24T14:17:08.267 回答
12

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

方法:

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

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

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

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

于 2014-11-24T14:35:05.130 回答
1

xml资源

    <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;
    }
于 2021-06-29T15:06:03.110 回答
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,就像我说的那样,这是一个建议,我还没有测试过。这将为您提供背景绑定,以及您尚未为其设置背景颜色的堆栈面板的后备值。让我知道这如何或是否适合您:)

于 2014-11-24T16:42:17.460 回答