【问题标题】:WPF Button Mouseover ImageWPF 按钮鼠标悬停图像
【发布时间】:2012-09-04 21:58:19
【问题描述】:

我正在学习 C# 和 XAML 来构建 Windows 应用程序。我想创建一个以图像为背景的按钮。但是当悬停在按钮上时,按钮的背景应该变成另一个“突出显示”的图像。我试图将背景图像添加到 Resources.resx 中。我必须使用 xaml 样式创建一个自定义按钮,以摆脱 wpf 按钮的默认突出显示效果。

我根据在 SO 上找到的一些代码创建了一个自定义按钮。代码是(在新的资源字典中):

    <!-- This style is used for buttons, to remove the WPF default 'animated' mouse over effect -->
    <Style x:Key="StartMenuButtons" TargetType="Button">
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="Margin" Value="5"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border Name="border" 
                        BorderThickness="0" 
                        Background="{TemplateBinding Background}">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">


                        <!-- UPDATE THE BUTTON BACKGROUND -->
                        <Setter Property="Background" Value="WHAT GOES HERE"  TargetName="border"/>


                    </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

我应该放什么以使背景变为另一个图像,无论它是在我的 resources.resx 还是其他位置? (不确定在哪里放置图像以访问它)。我搜索了 SO,但我找到的解决方案并不完全是我正在处理的。如果这是一个重复的问题,我深表歉意。

总结:

如何在 XAML 中更改鼠标悬停触发器上按钮的背景图像? 我应该将图像放在哪里,以便在触发代码中可以访问它?

更新 这是我作为触发动作放置的,但图像没有更新。我确保将图像构建操作设置为资源并将其放在名为 Resources 的文件夹中。

代码是:

<ControlTemplate.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
        <Setter Property="Background">
          <Setter.Value>
             <ImageBrush ImageSource="/Simon;component/Resources/btn_bg_hover.jpg" />
          </Setter.Value>
        </Setter>
     </Trigger>

文件结构是

Simon
    Simon
        Resources
            all the images
        Fonts
        bin
        obj
        Properties

解决方案

以下是允许在按钮上更改鼠标悬停图像的完整代码:

<!-- This style is used for buttons, to remove the WPF default 'animated' mouse over effect -->
    <Style x:Key="StartMenuButtons" TargetType="Button">
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="Margin" Value="5"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border Name="border" 
                        BorderThickness="0" 
                        Background="{TemplateBinding Background}">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" TargetName="border">
                            <Setter.Value>
                                <ImageBrush ImageSource="Resources/btn_bg_hover.jpg" />
                            </Setter.Value>
                        </Setter>

                    </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

对于实际图像,我将其放在根目录中的 Resources 文件夹中。在使用 Visual Studio 中的资源工具将图像导入其中后,我在“属性”窗格中将图像 build settings 更新为 Resource

感谢 dbaseman 的解决方案

【问题讨论】:

    标签: c# wpf xaml wpf-controls


    【解决方案1】:

    我认为将图像添加到项目中的/Images 文件夹会更容易。那么这是你使用的语法:

    <ControlTemplate TargetType="Button">
        <Border Name="border" BorderThickness="0" 
                    Background="Transparent">
              <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background">
                   <Setter.Value>
                       <ImageBrush ImageSource="/MyProjectName;component/Images/MyImage.jpg" />
                   </Setter.Value>
                </Setter>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    

    (假设您的图像 MyImage.jpg 位于项目根目录的 Images 文件夹中。)

    只要确保MyImage.jpg 的“构建操作”设置为“资源”即可。

    【讨论】:

    • 我有一个存储我的图像的资源文件夹。我像你一样添加了代码,但是当我将鼠标悬停时,图像没有改变?我确保图像的“构建操作”设置为资源。有什么想法吗?
    • @Ishikawa 首先,您确定您正确引用了图像吗?在设计视图中使用基本的&lt;Image Source='' /&gt; 元素,并确保它正确显示。源代码应该只是 /Simon;component/Resources/image.jpg,但还有一个向导按钮可以让 Visual Studio 设置它。
    • 我使用了这个并且图像正确显示。我尝试将“/Resources/btn_bg_hover.jpg”放入原始​​代码中,但它仍然没有改变任何东西。我真的很感激帮助。有什么想法吗?
    • @Ishikawa 我明白问题所在了...背景必须先设置为样式。
    • 我刚刚解决了!我忘记在 TargetName 之后添加 TargetName。它现在对我来说可以正常工作。再次感谢您的帮助。
    【解决方案2】:

    这是另一种方法。

    您可以使用图像 MouseEnter 和 MouseLeave 这两个事件。 现在在您的代码中执行此操作。

    XAML

    <Image x:Name="image1" HorizontalAlignment="Left" Height="142" Margin="64,51,0,0" VerticalAlignment="Top" Width="150" MouseEnter="image1_MouseEnter" MouseLeave="image1_MouseLeave"   />
    

    C#

    private void image1_MouseEnter(object sender, MouseEventArgs e)
    {
        string packUri = @"pack://application:,,,/Resources/Polaroid.png";
        image1.Source = new ImageSourceConverter().ConvertFromString(packUri) as ImageSource;
    }
    
    private void image1_MouseLeave(object sender, MouseEventArgs e)
    {
        string packUri = @"pack://application:,,,/Resources/PolaroidOver.png";
        image1.Source = new ImageSourceConverter().ConvertFromString(packUri) as ImageSource;
    }
    

    【讨论】:

    • 我认为上面的代码非常糟糕。 WPF 支持 MVVM 模式。但是,如果在后面的代码中使用上面的代码。太可怕了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2017-06-09
    • 2012-12-25
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多