按钮触发事件对边界无效吗?

时间:2019-03-28 11:39:22

标签: c# xaml

我搜索了很多有关如何在wpf中创建按钮模板的方法,以避免或覆盖默认的鼠标悬停事件,并且我创建了自己的模板(在其他代码的帮助下),但是我的代码可能无法正常工作。我想更改背景颜色并更改边框外观,但边框触发不起作用。请检查我的代码并指导我修复它。

        <Button x:Name="AccountBtn" Width="250" Height="100" Margin="5 5 5 5" >
            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="Button">
                                <Border Name="Myborder" BorderThickness="1 1 1 1" BorderBrush="#EDEDED" Background="{TemplateBinding Background}">
                                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter Property="BorderBrush" Value="LightGray"/>
                                        <Setter Property="BorderThickness" Value="2 2 2 2"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" Value="Green"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>

1 个答案:

答案 0 :(得分:1)

正确的代码如下

<Button x:Name="AccountBtn" Width="250" Height="100" Margin="5 5 5 5" >
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="BorderThickness" Value="1 1 1 1"/>
            <Setter Property="BorderBrush" Value="#EDEDED"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border Name="Myborder"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                Background="{TemplateBinding Background}">
                            <ContentPresenter HorizontalAlignment="Center"
                                              VerticalAlignment="Center"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="Green"/>
                    <Setter Property="BorderBrush" Value="LightGray"/>
                    <Setter Property="BorderThickness" Value="2 2 2 2"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

您的代码的问题不在于触发器不起作用。触发器可以正常工作,但是模板中的BorderBrushBorderThickness属性值将被忽略!

所以我以这样的方式更改了代码

  • BorderBrushBorderThickness的值来自Button的属性,
  • 以样式设置初始值,
  • (可选)将触发器从控制模板直接移动到样式。

仅此而已!