【问题标题】:Disable automatic MouseHover in Windows Presentation Foundation WPF C#在 Windows Presentation Foundation WPF C# 中禁用自动鼠标悬停
【发布时间】:2020-11-03 13:40:28
【问题描述】:

我创建了一个 Windows Presentation Foundation WPF 应用程序。

问题是自动 MouseHover,当我将鼠标悬停在按钮上时会产生蓝色闪烁。

我检查了所有组件,堆栈面板、网格、按钮...等,在我的选项中没有 MouseHover 动作,它在某种程度上是默认悬停,我无法禁用它。我可以以某种方式禁用或更改它吗?

<Window x:Class="EnovaLauncher.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:EnovaLauncher"
        mc:Ignorable="d"
        WindowStartupLocation="CenterScreen"
        Loaded="Window_Loaded"
        Title="Enova launcher" Height="586" Width="800" Background="#FF19680C">
    <Grid VerticalAlignment="Center" Margin="0,-60,0,0" Height="483">
        <StackPanel Margin="0,0,0,-59">
            <StackPanel.Resources>
                <Style TargetType="TextBlock">
                    <Setter Property="Margin" Value="4" />
                </Style>
                <Style TargetType="TextBox">
                    <Setter Property="Margin" Value="4" />
                </Style>
                <Style TargetType="ComboBox">
                    <Setter Property="Margin" Value="4" />
                </Style>
                <Style TargetType="Button">
                    <Setter Property="Margin" Value="4" />
                </Style>
            </StackPanel.Resources>
            <TextBlock Foreground="White">Ostatnio uruchamiane</TextBlock>
            <DockPanel>
                <Button DockPanel.Dock="Right" x:Name="btn_Delete" Click="btn_Delete_Click">X</Button>
                <ComboBox Name="cb_Recent" SelectionChanged="cb_Recent_SelectionChanged"></ComboBox>
            </DockPanel>

            <TextBlock Foreground="White">Parametry</TextBlock>
            <TextBlock Foreground="White">Nazwa</TextBlock>
            <TextBox x:Name="tb_Name"></TextBox>
            <Grid>
                <StackPanel>
                    <StackPanel>
                        <TextBlock Foreground="White">Wersja</TextBlock>
                        <ComboBox Name="cb_Version"></ComboBox>
                    </StackPanel>
                    <StackPanel Grid.Column="1">
                        <TextBlock Foreground="White">DBextensions</TextBlock>
                        <CheckBox x:Name="checkbox"  Foreground="White" Content="Dodaj" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,5,0,5"/>
                    </StackPanel>
                    <StackPanel Grid.Column="2">
                        <TextBlock Foreground="White">Operator</TextBlock>
                        <TextBox x:Name="tb_Op"></TextBox>
                    </StackPanel>
                    <StackPanel Grid.Column="3">
                        <TextBlock Foreground="White">DbConfig</TextBlock>
                        <ComboBox Name="cb_Db" SelectionChanged="cb_Db_SelectionChanged">
                            <ComboBox.Background>
                                <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                                    <GradientStop Color="#FFF0F0F0" Offset="0"/>
                                    <GradientStop Color="#FFE5E5E5" Offset="1"/>
                                </LinearGradientBrush>
                            </ComboBox.Background>
                        </ComboBox>
                    </StackPanel>
                    <StackPanel Grid.Column="4">
                        <TextBlock Foreground="White">ExtPath</TextBlock>
                        <ComboBox Name="cb_Extensions" SelectionChanged="cb_Extensions_SelectionChanged">
                            <ComboBox.Background>
                                <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                                    <GradientStop Color="#FFF0F0F0" Offset="0"/>
                                    <GradientStop Color="#FFE5E5E5" Offset="1"/>
                                </LinearGradientBrush>
                            </ComboBox.Background>
                        </ComboBox>
                    </StackPanel>
                </StackPanel>
            </Grid>
            <Button x:Name="btn_Load"  Height="40" Click="btn_LoadFromShortcut" Content="Załaduj skrót" Background="#FF498D11" FontSize="14" Foreground="White"/>
            <Button x:Name="btn_Shortcut" Height="40" Click="btn_Shortcut_Click" Content="Utwórz skrót" Background="#FF498D11" Foreground="White"  FontSize="14"/>
            <Button x:Name="btn_Launch" Height="40" Click="btn_Launch_Click" Content="Uruchom" Background="#FF498D11" Foreground="White"  FontSize="14"/>

        </StackPanel>
    </Grid>
</Window>

【问题讨论】:

  • 这似乎是一个 wpf 项目,而不是 Winforms。还是在 Windows 窗体中托管 wpf 控件?
  • 如果这是一个 wpf 项目,请查看以下链接 stackoverflow.com/questions/3854317/…
  • 好吧,如果它是 WPF 项目,那么我该怎么做才能改变这个自动悬停?

标签: c# windows-forms-designer


【解决方案1】:

您必须为您的Button 定义一个Style 和一个Template,然后在其中定义某些Triggers 的行为。您正在寻找的Trigger 称为IsMouseOver。这里有一个小例子,Background 颜色设置为 Aqua。

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border
                    Width="{TemplateBinding Width}"
                    Height="{TemplateBinding Height}"
                    Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    CornerRadius="0"
                    SnapsToDevicePixels="True">
                    <ContentPresenter 
                        Margin="{TemplateBinding Padding}"/>
                </Border>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <!-- Define your MouseOver behaviour here! E.g.:-->
                        <Setter Property="Background" Value="Aqua" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【讨论】:

  • 我无法解决。我没有动作 isMouseOver,只有 MouseEnter、MouseDown、MouseLeave
  • 您查看的是Events ,而不是Triggers。正如我所说,您必须在您的样式中添加一个Template ,其中包括触发器。
  • 是否可以缩短此代码?我需要做所有这些事情才能创建悬停效果吗?因为现在我有一个自动悬停,我想要的只是改变它的颜色
  • 您通常将样式捆绑到一个(或多个)样式类中。这意味着您可以重复使用它们。如果您不总是想更改 IsMouseOver 行为,您可以创建一个基本样式,然后基于该基本样式创建更多样式。
  • 兄弟,我得到了这个可以工作的东西,但不得不使用不同的代码,因为这使我的按钮变得扁平而不是动态的。还是谢谢你
猜你喜欢
  • 2011-10-04
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
相关资源
最近更新 更多