WPF按钮背景mouseenter并且不按预期工作

时间:2013-12-16 11:31:11

标签: c# wpf xaml

我有一个像这样的WPF按钮:

<Page.Resources>
      <ImageBrush x:Key="black_pane_normal" ImageSource="/Images/TroubleShooting/black_pane_clear.png" />
</Page.Resources>

<Button x:Name="ButtonBlackPane" Background="{StaticResource black_pane_normal}" HorizontalAlignment="Left"  VerticalAlignment="Top" Width="157" Height="136" MouseEnter="ButtonBlackPane_MouseEnter" MouseLeave="ButtonBlackPane_MouseLeave" Click="ButtonBlackPane_Click" RenderTransformOrigin="0.533,0.281" Margin="189,199,0,0"/>

我的C#代码背后是:

    BitmapSource _black_pane_yellow_border = Imaging.CreateBitmapSourceFromHBitmap(InstallerToolkit.Properties.Resources.black_pane_yellow.GetHbitmap(),
                                                                          IntPtr.Zero,
                                                                          Int32Rect.Empty,
                                                                          BitmapSizeOptions.FromEmptyOptions());

    BitmapSource _black_pane_no_border = Imaging.CreateBitmapSourceFromHBitmap(InstallerToolkit.Properties.Resources.black_pane_clear.GetHbitmap(),
                                                                          IntPtr.Zero,
                                                                          Int32Rect.Empty,
                                                                          BitmapSizeOptions.FromEmptyOptions());

    private void ButtonBlackPane_MouseEnter(object sender, MouseEventArgs e)
    {
        ButtonBlackPane.Background = new ImageBrush(_black_pane_yellow_border);
    }

    private void ButtonBlackPane_MouseLeave(object sender, MouseEventArgs e)
    {
        ButtonBlackPane.Background = new ImageBrush(_black_pane_no_border);
    }

我的第一个问题是我的图片没有填满整个按钮背景,我如何填写它?

我的第二个问题是,当鼠标进入按钮时,正确的背景图像会显示片刻,然后显示默认的灰色按钮图像,我的图像会消失,我该如何解决?

1 个答案:

答案 0 :(得分:1)

首先,首先使用静态资源设置背景,然后每次使用代码将其设置为新的ImageBrush对象,这不是一个好习惯。查看FindResource方法(http://msdn.microsoft.com/de-de/library/system.windows.frameworkelement.findresource(v=vs.110).aspx)以在后面的代码中使用您的资源。

其次,您应该使用样式和触发器来修改控件的外观,具体取决于MouseOver-State。有一个名为IsMouseOver的属性,您可以使用它。这是一个例子:

<Page.Resources>
    <Style TargetType="Button" x:Key="myButtonStyle">
        <Setter Property="Foreground" Value="Red" />
        <Setter Property="FontSize" Value="12" />
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="true">
                <Setter Property="Foreground" Value="Blue" />
                <Setter Property="Cursor" Value="Hand"/>
                <Setter Property="FontSize" Value="16" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Page.Resources>

<Button Width="200" Height="100" Style="{StaticResource myButtonStyle}">Hello, World!</Button>

第三,由于WPF按钮的默认模板,使用鼠标悬停时无法直接更改其背景。这里讨论并解决了这个问题:How do you change Background for a Button MouseOver in WPF? 如果您想了解有关样式化WPF控件以及如何使用默认模板的更多信息,请查看此处:http://msdn.microsoft.com/en-us/library/aa970773.aspx