代码之家  ›  专栏  ›  技术社区  ›  Luiscencio

WPF样式按钮鼠标悬停问题

  •  9
  • Luiscencio  · 技术社区  · 15 年前

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

    这是我的代码:

    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 回复  |  直到 12 年前
        1
  •  24
  •   Alex L Joseph Sturtevant    12 年前

    根据 this post ,这个花哨的动画是内置的,要移除它,需要重写 ControlTemplate 为了你的 Button . 幸运的是,这并不难。我用过 this post 作为源材料,并提出了以下内容 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>
    

    更新: 如果你已经下定决心要申请 风格 在代码中,您不想使用 ResourceDictionary (可能是更好的方法),您可以加载 风格 动态使用 XamlReader.Load :

                const string xaml = @"
    <Style xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
           xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
           TargetType='Button'>
        <Setter Property='Template'>
            <!--- Omitted For Clarity --->
        </Setter>
        <Style.Triggers>
            <Trigger Property='IsMouseOver' Value='True'>
                <Setter Property='Background' Value='Beige' />
            </Trigger>
        </Style.Triggers>
    </Style>";
                var encoding = new ASCIIEncoding();
                var bytes = encoding.GetBytes(xaml);
                var style = (Style)XamlReader.Load(new MemoryStream(bytes));
                Button1.Style = style;
    
        2
  •  4
  •   Kman    14 年前

    覆盖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>
    

    然后添加你自己对鼠标器的处理

        <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>
    

    那就解决了!:)

    推荐文章