C# 使用触发器设置边框笔刷的颜色

C# 使用触发器设置边框笔刷的颜色,c#,.net,wpf,xaml,triggers,C#,.net,Wpf,Xaml,Triggers,我在ControlTemplate中正确计算语法时遇到了一些困难。以下是它的基本原理: <ControlTemplate TargetType="{x:Type foo:bar"> <Border Name="Bd"> <Border.BorderBrush> <SolidColorBrush Color="{DynamicResource DefaultBorderBrushLightBrush}"

我在
ControlTemplate
中正确计算语法时遇到了一些困难。以下是它的基本原理:

<ControlTemplate TargetType="{x:Type foo:bar">
    <Border Name="Bd">  
        <Border.BorderBrush>
            <SolidColorBrush Color="{DynamicResource DefaultBorderBrushLightBrush}" />
        </Border.BorderBrush>
    </Border>

    <ControlTemplate.Triggers>
        <Trigger Property="IsSelected" Value="true">
            <Setter Property="(Border.BorderBrush).(SolidColorBrush.Color)"
                    TargetName="Bd"
                    Value="{DynamicResource PressedBorderDarkColor}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate


这意味着,当样式/控制模板集
TargetType
(例如-
Border
)是在中指示的属性时:

<Style x:Key="TestStyle" TargetType="{x:Type Border}>
    <Setter Property="BorderBrush" Value="Green" />
在样式中,可以采用两种方式,设计类型如下:

(Border.BorderBrush).(SolidColorBrush.Color)

通常用于故事板的

不能设置画笔颜色,因为它不是目标边界对象的属性Bd,目标对象具有属性BorderBrush,而颜色是对象SolidColorBrush的属性,受BorderBrush属性影响。语法(Border.BorderBrush)。(SolidColorBrush.Color)用于指定故事板的附加属性
TargetProperty
,例如在动画中:

<VisualState x:Name="MouseOver">
                <Storyboard>
                  <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).
                      (GradientBrush.GradientStops)[1].(GradientStop.Color)"
                                                Storyboard.TargetName="Border">
                    <EasingColorKeyFrame KeyTime="0"
                                         Value="{StaticResource ControlMouseOverColor}" />
                  </ColorAnimationUsingKeyFrames>
                </Storyboard>
              </VisualState>


目标对象不是foo:bar;目标对象是名为“Bd”的对象,其类型为
Border
。当然它也没有
Color
属性,但是如果你看的话,你会看到borders的颜色是左右设置的(虽然是动画,而不是触发器)。@mcwyrm:我理解,正如你所说的颜色不是对象边框的属性,如果颜色像你最近说的那样被使用,这只是因为它是与它们相关的对象的属性,例如
GradientStop
,我将更新我的答案。我相信在这种情况下,背景中有一个转换器,可以将字符串转换为画笔。因为我引用的资源是一种颜色,而不是画笔或字符串,所以这种语法对我不起作用。所以Class.Property语法是否仅在情节提要中有效?为什么它在这里不起作用?@mcwyrm:
Class.Property
在任何地方都有效,无论是在样式中还是在情节提要中。故事板的
TargetProperty
属性支持复杂语法(
(Border.BorderBrush)。(SolidColorBrush.Color)
),使您能够以其他属性的属性为目标。有关以属性为目标的不同方法的详细说明,请参见。
<Style x:Key="TestStyle">
    <Setter Property="Border.BorderBrush" Value="Red" />
(Border.BorderBrush).(SolidColorBrush.Color)
<VisualState x:Name="MouseOver">
                <Storyboard>
                  <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).
                      (GradientBrush.GradientStops)[1].(GradientStop.Color)"
                                                Storyboard.TargetName="Border">
                    <EasingColorKeyFrame KeyTime="0"
                                         Value="{StaticResource ControlMouseOverColor}" />
                  </ColorAnimationUsingKeyFrames>
                </Storyboard>
              </VisualState>