如何从 C# 代码更改 DynamicResource?

MeL*_*blo 1 c# wpf dynamicresource

我有一个简单的“播放/暂停”按钮,在应用程序开始时显示“播放”图标。这是它的代码:

<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"/>`
Run Code Online (Sandbox Code Playgroud)

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

playPauseButton.Content = "{DynamicResource appbar_control_stop}";
Run Code Online (Sandbox Code Playgroud)

它只显示按钮内的字面字符串。我怎么能改变那个属性?

Jcl*_*Jcl 5

您在 XAML 中使用的字符串{ }是特殊的(它们被称为标记扩展),因此 XAML 处理器不会将它们视为“字符串”(而是调用扩展来提供结果对象,而不是直接分配字符串)。特别是,您将在此处使用DynamicResource 标记扩展

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

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

playPauseButton.Content = FindResource("appbar_control_stop");
Run Code Online (Sandbox Code Playgroud)

或者,如果你想这样DynamicResource做,你可以尝试SetResourceReference,例如:

playPauseButton.SetResourceReference(ContentControl.ContentProperty, "appbar_control_stop");
Run Code Online (Sandbox Code Playgroud)

第二种方法将为资源分配一个真正的引用(而不是仅仅加载它),因此如果资源发生变化(因为父级发生变化,或使用事件或任何事情),将重新评估该属性。