【问题标题】:Change color of toggle (TreeView) in wpf programmatically以编程方式更改 wpf 中切换(TreeView)的颜色
【发布时间】:2014-09-05 06:15:36
【问题描述】:

我在以编程方式更改 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 模板化组件有点困惑,所以我猜它那里有问题。 感谢大家的帮助

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

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

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

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

【问题讨论】:

  • 您的问题似乎与这里提出的问题非常相似:stackoverflow.com/questions/15819796/… 答案和讨论可能对您有用。
  • 谢谢提示,我会检查一下..
  • 您可以在this web page 找到ToggleButton 的默认ControlTemplate。或者,如果这没有帮助,也许您可​​以使用绑定或事件处理程序来实现您想要的?尝试从另一个方向看它。您的总体目标是什么?
  • 我的目标是:用户更改切换按钮的背景颜色。 :] 但我“解决”它没有切换按钮,这是我认为最好的解决方案:D

标签: c# wpf treeview wpf-controls togglebutton


【解决方案1】:

StaticResource 只会读取初始颜色。为了动态更新颜色,您需要将您的Brush 声明为DynamicResource。

<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">

this post中有一个例子。

【讨论】:

  • 我也用 dynamicResource 尝试过,但没有任何改变。它与 StaticResource 完全相同:(。但感谢提示
  • 查看我添加到答案中的帖子。
  • “这篇文章”正在链接这个页面^^
  • 哦,对不起,真丢脸……我会解决的。
  • 感谢帖子,查看我的帖子(编辑 2)。价值改变有效。但在那之后它就不能应用在toggleButton上。
【解决方案2】:

尝试替换Brush - 不要更改其Color,例如...

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

即Brush 可能是 Freezed。检查例如这个链接(只是第一个)Style Setter Freezing Brush

如果您执行以下操作...

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

...你可能永远不会进入。如果访问冻结的对象,也会出现异常。

或者更好的是,你应该这样做……

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;

有关更多详细信息,请查看该主题的第一个 MS 链接,该链接恰好涉及这些问题...

Freezable Objects Overview

【讨论】:

  • 它对你的风格有影响 - 我不知道你可能还有什么
【解决方案3】:

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

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

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

【讨论】:

  • 从第二张图片看起来你改变了borderBrush的值。但我无法更改路径填充颜色..:/..边框颜色(边框背景)对我来说非常适合..
  • 不,实际上是背景属性,图像被裁剪。 (抱歉没注意)
【解决方案4】:

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

<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 代码 sn-p 但我不得不在以前的项目中做类似的工作。

【讨论】:

    猜你喜欢
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 2015-12-06
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多