如何从 C# 代码更改 DynamicResource?

How to change a DynamicResource from C# code?

我有一个简单的 "Play/Pause" 按钮,它在应用程序开始时显示 "play" 图标。这是它的代码:

<Button x:Name="playPauseButton" Style="{DynamicResource MetroCircleButtonStyle}" 
                        Content="{DynamicResource appbar_control_play}"
                        HorizontalAlignment="Left" Margin="77,70,0,0" VerticalAlignment="Top" Width="75" Height="75" Click="Button_Click"/>`

我想做的是在按下时将播放图标更改为暂停图标。我所要做的就是将内容更改为 {DynamicResource appbar_control_pause}。但是,当我执行以下操作时:

playPauseButton.Content = "{DynamicResource appbar_control_stop}";

它仅按字面意思显示按钮内的字符串。我该如何更改 属性?

你在XAML中用{ }写的字符串比较特殊(这里叫Markup Extensions), so they are not treated as "strings" by the XAML processor (it instead invokes the extension to provide the resulting object, instead of assigning the string directly). In particular, you'd be using the DynamicResource markup extension

但这仅适用于 XAML 处理器,因此当您使用 C# 代码中的字符串分配 Content 属性 时,它只会分配特定的字符串:它不会被解析完全由 XAML 处理器(并且永远不会调用 DynamicResource 标记扩展)。

如果你想在代码中加载资源,你可以尝试:

playPauseButton.Content = FindResource("appbar_control_stop");

或者,如果您想像 DynamicResource 那样做,您可以尝试 SetResourceReference,例如:

playPauseButton.SetResourceReference(ContentControl.ContentProperty, "appbar_control_stop");

第二种方法会为资源分配一个真正的引用(而不是仅仅加载它),所以如果资源改变(因为父改变,或使用事件或任何东西),属性 将是重新评估。