1

我制作了一个新控件,其中包含一个矩形和一些视觉状态。

 <Style TargetType="Button" x:Key="banda">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Grid>

                            <Grid.ColumnDefinitions >
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions >
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualStateGroup.Transitions>
                                        <VisualTransition GeneratedDuration="0:0:0.1"/>
                                    </VisualStateGroup.Transitions>
                                    <VisualState x:Name="Pressed">
                                        <Storyboard>
                                            <ColorAnimation Duration="0" To="#FF47B215" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Normal">
                                        <Storyboard>
                                        <ColorAnimation Duration="0" To="{Binding Background, ElementName=Border}" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Disabled"/>
                                    <VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <ColorAnimation Duration="0" To="#FF86B072" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                        <Border x:Name="Border" Background="purple" StrokeThickness="5"  Stroke="{Binding Background, ElementName=Border}"/>
                        </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        </Style>

此控件在我的应用程序页面中多次使用,我希望矩形在每次使用时都具有不同的颜色值,例如当我按下按钮时,矩形会改变颜色。

我不知道如何在 c# 代码中更改矩形的属性。有人可以帮我格式化吗?

4

1 回答 1

0

Background不费吹灰之力,只需像这样将其绑定到模板中即可;

<Style TargetType="Button" x:Key="banda">
           <Setter Property="Background" Value="Purple"/>
           <Setter Property="BorderThickness" Value="5"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Grid>
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualStateGroup.Transitions>
                                        <VisualTransition GeneratedDuration="0:0:0.1"/>
                                    </VisualStateGroup.Transitions>
                                    <VisualState x:Name="Pressed">
                                        <Storyboard>
                                            <ColorAnimation Duration="0" To="#FF47B215" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Normal">
                                        <Storyboard>
                                        <ColorAnimation Duration="0" To="{Binding Background, ElementName=Border}" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Disabled"/>
                                    <VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <ColorAnimation Duration="0" To="#FF86B072" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                        <Border x:Name="Border" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{Binding Background, ElementName=Border}"/>
                        </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
     </Style>

因此,这样,默认颜色将是紫色(如Setter声明中所示),您可以像这样动态更改它;

<Button Style="{StaticResource banda}" Content="Blah" Background="Orange"/>

然而; 通常建议您不要将许多状态更改附加到单个对象。例如,如果您将模板加载到 Expression blend 中,您将在编辑模板时查看状态面板,您会看到一个三角形感叹号图标,警告您不建议围绕单个对象建立太多状态你的模板。大多数时候它都很好,并且会按原样工作。此外,您已经Stroke&StrokeThickness应用于Border没有那些依赖属性的 a,因此在示例中我也将其修复为BorderThicknessand BorderBrush。哦,你可能还会发现你是如何拥有你的财产的,所以相互关系会为你带来麻烦。抛弃诸如此类的东西;

                         <VisualState x:Name="Normal">
                                <Storyboard>
                                <ColorAnimation Duration="0" To="{Binding Background, ElementName=Border}" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/>
                                </Storyboard>
                            </VisualState>

而是将其绑定到Background属性 via {TemplateBinding Background}。我建议查看一些按钮的默认控件模板并进行比较以了解更多关于它们的使用方式。

希望这可以帮助。

于 2013-06-24T18:08:58.027 回答