C# WPF:设置样式后找不到正确的边框笔刷

C# WPF:设置样式后找不到正确的边框笔刷,c#,wpf,xaml,button,styles,C#,Wpf,Xaml,Button,Styles,我有一个按钮,我也应用了一种风格。应用样式后,我进行了一项测试,检查按钮的边框笔刷,以确保正确应用了样式。此测试始终失败,因为BorderBrush从未在按钮属性中更新 是否有一种方法可以让我获得正在显示的实际边界笔刷?我能得到的只是默认的边界笔刷,而不是应用的样式值 我使用的样式是: <Style x:Key="ActiveModuleBtnStyleOn" TargetType="Button"> <Setter Property="Template"&g

我有一个按钮,我也应用了一种风格。应用样式后,我进行了一项测试,检查按钮的边框笔刷,以确保正确应用了样式。此测试始终失败,因为BorderBrush从未在按钮属性中更新

是否有一种方法可以让我获得正在显示的实际边界笔刷?我能得到的只是默认的边界笔刷,而不是应用的样式值

我使用的样式是:

    <Style  x:Key="ActiveModuleBtnStyleOn" TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid>
                    <Border Margin="0" 
                                    BorderThickness="3" 
                                    BorderBrush="Green" 
                                    Background="White" 
                                    VerticalAlignment="Stretch" 
                                    CornerRadius="4" 
                                    HorizontalAlignment="Stretch">
                        <Border.Effect>
                            <DropShadowEffect BlurRadius="10" Color="Black" Direction="325" Opacity=".5" RenderingBias="Quality" ShadowDepth="5" />
                        </Border.Effect>
                    </Border>
                    <TextBlock Margin="2" Text="{TemplateBinding Content}" TextWrapping="Wrap" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="IsEnabled" Value="true"/>
</Style>
在我的测试应用程序中,我想检查应用了哪种样式。这两种样式的区别在于边框笔刷。我想这样做:

if(var1 == 1)
  TopologyNvTxBtn.Style = this.FindResource("ActiveModuleBtnStyleOn") as Style;
else
  TopologyNvTxBtn.Style = this.FindResource("ActiveModuleBtnStyleOff") as Style;
if(TopologyNvTxBtn.BorderBrush == Brushes.Green)
  return PASS;
但BorderBrush从不更改(例如,在监视窗口中,它与默认按钮样式的BorderBrush保持相同),但它确实正确应用,因为在GUI中它变为绿色

如何在测试中访问此属性


事先非常感谢

正如我上面所说的,
边框
按钮
控制模板
的一部分。我刚刚发布了Blend,并获得了“工厂”模板的副本。有了这个,你几乎可以用它做任何事情(假设你知道什么是撒谎):

因此,您需要的是
触发器
,您必须根据需要添加和更改这些标记:

                <ControlTemplate.Triggers>
                    <Trigger Property="IsDefaulted" Value="true">
                        <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="true">
                        <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
                        <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
                    </Trigger>
                </ControlTemplate.Triggers>

注意事项:
TargetName
和每个
都一样!
祝你好运

按钮的BorderBrush属性未绑定到模板中的任何内容。您需要在控件模板中执行此操作:

<Style  x:Key="ActiveModuleBtnStyleOn" TargetType="Button">
<Setter Property="BorderBrush" Value="Green" />
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type Button}">
            <Grid>
                <Border Margin="0" 
                                BorderThickness="3" 
                                BorderBrush="{TemplateBinding BorderBrush}" 
                                Background="White" 
                                VerticalAlignment="Stretch" 
                                CornerRadius="4" 
                                HorizontalAlignment="Stretch">
                    <Border.Effect>
                        <DropShadowEffect BlurRadius="10" Color="Black" Direction="325" Opacity=".5" RenderingBias="Quality" ShadowDepth="5" />
                    </Border.Effect>
                </Border>
                <TextBlock Margin="2" Text="{TemplateBinding Content}" TextWrapping="Wrap" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center"/>
            </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>
<Setter Property="IsEnabled" Value="true"/>
</Style>
让我知道这是否有效

干杯,
Eric

Andy,按钮的
控制模板
内设置了
边框
。查看此项了解更多信息!这是否意味着我无法在运行时访问它?您必须设置自己的
模板
-请参阅下文。不要忘记为您的元素添加
x:Name
!检查元素及其各自样式的一个很好的工具是。如果你计划在WPF中开发并设计你自己的元素和控件,那是必须具备的。这很好,但我已经具备了。设置我想要的样式没有问题,这很好。问题是在设置之后再查找设置的样式。我有一个绿色边框的按钮样式,但我在任何地方都看不到。如果我看按钮对象,边框仍然是灰色的。如果我看屏幕,它是绿色的。
Trigger
标记负责在某些操作(如
MouseOver
)发生时哪个属性会发生什么。您可以将样式放在
标记之间,也可以将它们设置在其他位置,并在文件中引用
xaml
。我看不出这如何告诉我正在使用的样式,这就是我需要的信息。我错过什么了吗?我需要一种在应用样式后在运行时访问边框的方法,请参阅我对原始帖子的编辑。现在我不确定你的意思。无论如何。您必须为元素指定一个
x:Name
,以便访问和强制转换它们。
                <ControlTemplate.Triggers>
                    <Trigger Property="IsDefaulted" Value="true">
                        <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="true">
                        <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
                        <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
<Style  x:Key="ActiveModuleBtnStyleOn" TargetType="Button">
<Setter Property="BorderBrush" Value="Green" />
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type Button}">
            <Grid>
                <Border Margin="0" 
                                BorderThickness="3" 
                                BorderBrush="{TemplateBinding BorderBrush}" 
                                Background="White" 
                                VerticalAlignment="Stretch" 
                                CornerRadius="4" 
                                HorizontalAlignment="Stretch">
                    <Border.Effect>
                        <DropShadowEffect BlurRadius="10" Color="Black" Direction="325" Opacity=".5" RenderingBias="Quality" ShadowDepth="5" />
                    </Border.Effect>
                </Border>
                <TextBlock Margin="2" Text="{TemplateBinding Content}" TextWrapping="Wrap" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center"/>
            </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>
<Setter Property="IsEnabled" Value="true"/>
</Style>
if(TopologyNvTxBtn.BorderBrush == Brushes.Green)