0

我在以编程方式更改 TreeView 中的切换颜色时遇到问题。我在 ResourceDictionary SolidColorBrush 中定义:

<SolidColorBrush x:Key="FillBrush" Color="#000000" />

我也在 ResourceDictionary 中为 toggleButton 创建了样式:

<Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
        <Setter Property="Focusable" Value="False"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToggleButton">
                    <Grid Width="auto" Height="auto" Background="Transparent" ShowGridLines="True">                        
                        <Path Fill="{StaticResource FillBrush}" x:Name="ExpandPath" HorizontalAlignment="Center"  VerticalAlignment="Center"
                                        Data="M 0 0 L 0 2 L 6 0 z M 6 2 L 6 0 L 0 2 z">
                        </Path>
                    </Grid>

                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter Property="Data" TargetName="ExpandPath" Value="M 0 0 L 0 8 L 2 0 z M 2 8 L 2 0 L 0 8 z"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

在代码中,我试图以编程方式更改 FillBrush 键的值:

SolidColorBrush cc = (SolidColorBrush)Resources["FillBrush"];
cc.Color=c.Color; 

但是当我改变它时,切换按钮不会改变。

任何提示如何更改现有组件的颜色?我对通过 ResourceDictionary 模板化组件有点困惑,所以我猜它那里有问题。感谢所有帮助

编辑:在代码中我“说”使用静态资源。我也用 DynamicResource 尝试过,但什么也没发生,颜色值也没有改变。

编辑 2:如果我检查 FillBrush 资源中的值:

MessageBox.Show(((SolidColorBrush)Resources["FillBrush"]).Color.ToString());

该值将替换为新值。所以它有效。在这种情况下,在 ToggleButton 样式中应用它一定有问题。

4

4 回答 4

0

Try replacing the Brush - not changing its Color, e.g...

this.Resources["FillBrush"] = new SolidColorBrush(Colors.Red);

i.e. Brush is likely Freezed. Check e.g. this link (just first) Style Setter Freezing Brush

If you do the following...

if( !brush.IsFrozen ) // 'not froze' i.e. free to change
    brush.Color = Colors.Red;  

...chances are you'll never enter. You also get exception if accessing a freezed object.

Or better yet, you should do...

var brush = (SolidColorBrush)this.Resources["FillBrush"];
if (brush.IsFrozen)
{
    SolidColorBrush clone = brush.Clone();
    clone.Color = Colors.Red;
    this.Resources["FillBrush"] = clone;
}
else
    brush.Color = Colors.Red;

For more details check this very first MS link on the subject which involves exactly these issues...

Freezable Objects Overview

于 2013-04-04T23:31:32.650 回答
0

AStaticResource只会读取初始颜色。为了动态更新颜色,您需要将您的声明BrushDynamicResource.

<Path Fill="{DynamicResource FillBrush}" x:Name="ExpandPath" HorizontalAlignment="Center"
    VerticalAlignment="Center" Data="M 0 0 L 0 2 L 6 0 z M 6 2 L 6 0 L 0 2 z">

这篇文章中有一个例子。

于 2013-04-04T21:56:36.420 回答
0

使用 Blend,我只需点击 5 次鼠标就可以做到这一点,

(要以全尺寸查看图像,请右键单击它并选择查看图像或在新选项卡中打开图像,具体取决于您使用的网络浏览器)

在此处输入图像描述

我没有粘贴生成的 XAML,因为有很多,只是 Blends 突出显示的部分。

在此处输入图像描述

于 2013-04-05T01:12:25.330 回答
0

有时,如果您要更改的项目被“隐藏”在一种样式中,当您尝试更改它时似乎无法识别它,至少这是我在尝试设置项目样式然后想要能够时所经历的动态更改颜色或字体系列。尝试这个:

<Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
   <Setter Property="Focusable" Value="False"/>
   <Setter Property="Foreground" Value="{StaticResource FillBrush}"/>
   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="ToggleButton">
            <Grid Width="Auto" Height="Auto" Background="Transparent" ShowGridLines="True">
               <Path Fill="{Binding Foreground}" x:Name="ExpandPath" HorizontalAlignment="Center" VerticalAlignment="Center" Data="M 0 0 L 0 2 L 6 0 z M 6 2 L 6 0 L 0 2 z"/>
            </Grid>
         </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>

并且当您想要更改切换按钮的颜色时 - 而不是更改 FillBrush 的颜色 = 您更改实际切换按钮的前景值。由于路径的填充绑定到前景色,这应该会触发它发生变化。

希望这对您有所帮助并且对您有用,我承认我没有测试过这个特定的 XAML 代码片段,但我不得不在以前的项目中做类似的工作。

于 2014-09-04T22:15:36.850 回答