Как динамически изменить цвет флажка в C # - PullRequest
2 голосов
/ 10 апреля 2011

Я делаю имитацию алгоритма минимального связующего дерева в C #. Для каждой вершины в моем графе я использую флажок в качестве визуального представления. Я хотел бы изменить цвет флажка каждый раз, когда вершина добавляется к минимальному остовному дереву. Флажок был разработан с использованием выражения blend 4 и уже имеет основные атрибуты (base, mouse over, selected и тому подобное). Базовый цвет черный, и мне бы хотелось, чтобы он был зеленым, когда вершина добавляется в дерево.

Это пример того, как я использую флажки:

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

где n имеет тип cNod, у которого graficNod является атрибутом типа Nod, который был создан в выражении blend с помощью xaml.

Как мне изменить основной цвет 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 Ответ

2 голосов
/ 25 апреля 2011

Простой: Я вижу, что вы довольно сильно изменили флажок, чтобы он напоминал вершину, но теперь он всегда будет черным эллипсом, потому что вы явно задали «Fill»:

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

Вместо этого используйте TemplateBinding, который будет изменять заливку всякий раз, когда вы устанавливаете свойство background для флажка:

<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

или вы можете связать свойство Background флажка в xaml со свойством background вершины, чтобы иметь более чистый подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...