如何在C#中动态更改复选框的颜色

时间:2011-04-10 12:29:44

标签: c# .net wpf xaml checkbox

我正在用C#模拟最小生成树算法。对于我图中的每个顶点,我使用复选框作为可视化表示。每次将顶点添加到最小生成树时,我想更改复选框的颜色。 该复选框是使用表达式混合4设计的,它已经具有基本属性(基础,鼠标悬停,选定等)。基色是黑色的,当顶点添加到树中时,我希望它是绿色。

这是我如何使用复选框的示例:

private void DeselectAll()
{
    foreach (var n in graf.Noduri)
    {
        CheckBox c = (CheckBox)n.graficNod.Content;
        c.IsChecked = false;
    }
}

其中n是cNod类型,其中graficNod是使用xaml在表达式混合中创建的Nod类型的属性。

如何更改graficNod的基色?

Nod.xaml看起来像这样:

<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
mc:Ignorable="d"
x:Class="SimulareGrafuri.Nod"
x:Name="UserControl"
Width="10"
Height="10"    
d:DesignWidth="640" d:DesignHeight="480">
<UserControl.Resources>
    <ControlTemplate x:Key="CheckBoxControlTemplate1" TargetType="{x:Type CheckBox}">
        <Grid>
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="CommonStates">
                    <VisualState x:Name="Normal"/>
                    <VisualState x:Name="MouseOver">
                        <Storyboard>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="ellipse">
                                <EasingColorKeyFrame KeyTime="0" Value="#FFD0CACA"/>
                            </ColorAnimationUsingKeyFrames>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="ellipse">
                                <EasingColorKeyFrame KeyTime="0" Value="Black"/>
                            </ColorAnimationUsingKeyFrames>
                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.StrokeThickness)" Storyboard.TargetName="ellipse">
                                <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                            </DoubleAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                    <VisualState x:Name="Pressed">
                        <Storyboard>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="ellipse">
                                <EasingColorKeyFrame KeyTime="0" Value="Black"/>
                            </ColorAnimationUsingKeyFrames>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="ellipse">
                                <EasingColorKeyFrame KeyTime="0" Value="#FF5A5454"/>
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                    <VisualState x:Name="Disabled"/>
                </VisualStateGroup>
                <VisualStateGroup x:Name="CheckStates">
                    <VisualState x:Name="Checked">
                        <Storyboard>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="ellipse">
                                <EasingColorKeyFrame KeyTime="0" Value="Black"/>
                            </ColorAnimationUsingKeyFrames>
                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="rectangle">
                                <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                            </DoubleAnimationUsingKeyFrames>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle">
                                <EasingColorKeyFrame KeyTime="0" Value="#FF540000"/>
                            </ColorAnimationUsingKeyFrames>
                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.StrokeThickness)" Storyboard.TargetName="rectangle">
                                <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                            </DoubleAnimationUsingKeyFrames>
                            <ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Margin)" Storyboard.TargetName="rectangle">
                                <EasingThicknessKeyFrame KeyTime="0" Value="-2"/>
                            </ThicknessAnimationUsingKeyFrames>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="ellipse">
                                <EasingColorKeyFrame KeyTime="0" Value="#FFA70808"/>
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                    <VisualState x:Name="Unchecked">
                        <Storyboard>
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="rectangle">
                                <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Collapsed}"/>
                            </ObjectAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                    <VisualState x:Name="Indeterminate"/>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
            <Ellipse x:Name="ellipse" Fill="Black" Margin="0" Stroke="Black" Width="Auto"/>
            <Rectangle x:Name="rectangle" Fill="{x:Null}" Margin="6,6,82,72" Opacity="0" Stroke="Black"/>
        </Grid>
    </ControlTemplate>
</UserControl.Resources>



<CheckBox Content="CheckBox" Template="{DynamicResource CheckBoxControlTemplate1}"/>

1 个答案:

答案 0 :(得分:2)

简单: 我看到你已经非常改变了复选框以类似于一个顶点,但现在它总是一个黑色的椭圆,因为你明确地设置了“填充”:

<Ellipse x:Name="ellipse" Fill="Black" Margin="0" Stroke="Black" Width="Auto"/>

使用TemplateBinding,只要设置复选框的背景属性,就会更改填充:

<Ellipse x:Name="ellipse" Fill="{TemplateBinding Background}" Margin="0" Stroke="Black" Width="Auto"/>

并将您的复选框声明更改为:

<CheckBox x:Name="chkVertex" Content="CheckBox" Template="{DynamicResource CheckBoxControlTemplate1}" Background="Red"/>

您可以随时使用以下代码更改代码隐藏颜色:

chkVertex.Background = //whatever color you like

或者你可以将xaml中复选框的Background属性绑定到顶点的background属性,以便更清晰地接近。