1

从下面的触发器中,只有 Foreground Setter 正在工作。我不懂为什么。

 <Style   TargetType="{x:Type Button}">
<Style.Triggers>
  <Trigger Property="IsMouseOver" Value="True">
    <Setter Property="Background" Value="Red"/>
    <Setter Property="BorderBrush" Value="Red"/>
    <Setter Property="Foreground" Value="Red"/>
  </Trigger>

谢谢你的帮助。

4

3 回答 3

2

这不起作用的原因是因为默认的 Button 模板使用 Button Chrome来绘制边框和背景,并根据 Windows 主题(例如 Windows XP 样式、Windows 7 样式)处理鼠标悬停和禁用等状态。

为了允许应用您的触发器,您将需要定义一个自定义 Button 模板,该模板使用标准可样式化的 WPF 元素,如 Border,而不是 ButtonChrome。这是一个简单的工作示例:

<Button Content="button">
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="BorderThickness" Value="3" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border Background="{TemplateBinding Property=Background}"
                                BorderBrush="{TemplateBinding Property=BorderBrush}"
                                BorderThickness="{TemplateBinding Property=BorderThickness}">
                            <ContentPresenter />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="Red" />
                    <Setter Property="BorderBrush" Value="Green" />
                    <Setter Property="Foreground" Value="Blue" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>
于 2013-09-27T19:05:11.107 回答
2

尝试在 controltemplate 上使用触发器。

    <ResourceDictionary>
        <Style x:Key="TestButton" TargetType="Button">
            <Setter Property="Height" Value="30" />
            <Setter Property="Width" Value="30" />
            <Setter Property="Background" Value="Transparent" />
            <Setter Property="Foreground" Value="Green" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Foreground" Value="Purple" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                        <Grid>
                            <Rectangle Fill="{TemplateBinding Foreground}" />
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
于 2013-09-27T18:08:13.833 回答
2

WPF 中的按钮有一个默认的控件模板。覆盖 Button 的默认行为的正确方法是覆盖默认控件模板。这可以通过类似于以下的方式来完成:

<Button Width="100" Height="50" Content="Click Me!">
  <Button.Template>
       <ControlTemplate TargetType="{x:Type Button}">
            <Border x:Name="bdr_main" CornerRadius="20" Margin="4" BorderThickness="1" BorderBrush="Black" Background="LightGray">
                 <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" Margin="8,6,8,6" ContentSource="Content" />
           </Border>
           <ControlTemplate.Triggers>
                 <Trigger Property="IsMouseOver" Value="True">
                     <Setter TargetName="bdr_main" Property="Background" Value="LightGreen"/>
                 </Trigger>
                <Trigger Property="IsPressed" Value="True">
                    <Setter TargetName="bdr_main" Property="Background" Value="Red"/>
               </Trigger>
           </ControlTemplate.Triggers>
       </ControlTemplate>
</Button.Template>

找到@http://harishasanblog.blogspot.com/2011/02/ismouseover-trigger-not-working-in-wpf.html

希望能帮助到你!

于 2013-09-27T18:07:03.940 回答