WPF样式按钮MouseOver问题

时间:2010-04-21 23:39:53

标签: c# wpf styles

我正在尝试对按钮进行简单的鼠标悬停效果,当鼠标结束但颜色立即更改为默认按钮背景时它会改变颜色...我该如何覆盖此行为?

这是我的代码:

Style myBtnStyle = new Style();
Trigger bla = new Trigger() { Property = IsMouseOverProperty, Value = true };
bla.Setters.Add(new Setter(Control.BackgroundProperty, Brushes.Black));
myBtnStyle.Triggers.Add(bla);
button2.Style = myBtnStyle;

2 个答案:

答案 0 :(得分:24)

根据this post,内置动画并将其删除,您需要覆盖ControlTemplate的{​​{1}}。幸运的是,这并不难。我使用this post作为源材料,并提出了以下Button给您的想法。

Style

<强>更新 如果您在代码中应用<Style x:Key="MouseOverButtonStyle" TargetType="Button"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <ControlTemplate.Resources> <Style x:Key="ShadowStyle"> <Setter Property="Control.Foreground" Value="LightGray" /> </Style> </ControlTemplate.Resources> <Border Name="border" BorderThickness="1" Padding="4,2" BorderBrush="DarkGray" CornerRadius="3" Background="{TemplateBinding Background}"> <Grid > <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Name="contentShadow" Style="{StaticResource ShadowStyle}"> <ContentPresenter.RenderTransform> <TranslateTransform X="1.0" Y="1.0" /> </ContentPresenter.RenderTransform> </ContentPresenter> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Name="content"/> </Grid> </Border> </ControlTemplate> </Setter.Value> </Setter> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="Beige" /> </Trigger> </Style.Triggers> </Style> 并且不想使用Style(可能是更好的方法),则可以动态加载ResourceDictionary使用Style

XamlReader.Load

答案 1 :(得分:4)

覆盖ButtonChrome主题会更容易。

创建模板并删除RenderMouseOver =“{TemplateBinding IsMouseOver}”

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="Button">
            <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}"RenderPressed="{TemplateBinding IsPressed}" RenderDefaulted="{TemplateBinding Button.IsDefaulted}" SnapsToDevicePixels="True">
                <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
            </Microsoft_Windows_Themes:ButtonChrome>
            <ControlTemplate.Triggers>
                <Trigger Property="IsKeyboardFocused" Value="True">
                    <Setter Property="RenderDefaulted" TargetName="Chrome" Value="True"/>
                </Trigger>
                <Trigger Property="ToggleButton.IsChecked" Value="True">
                    <Setter Property="RenderPressed" TargetName="Chrome" Value="True"/>
                </Trigger>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Foreground" Value="#FFADADAD"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Setter.Value>
</Setter>

然后添加您自己的mouseover处理

    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background">
                <Setter.Value>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FFF3E8D5" Offset="0"/>
                        <GradientStop Color="#FFF49B03" Offset="1"/>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>

那应该解决它! :)

相关问题