MouseEnter 和 MouseLeave 使按钮在不应隐藏时消失

MouseEnter and MouseLeave makes buttons disappear when they shouldn't be hidden

如果我还有头发,我早就拔掉了。我对 WPF 越来越好,但我仍然 运行 遇到像这样的奇怪问题。

编辑:它与自定义控件中对象之间的透明背景有关。一时兴起,我将顶部堆栈面板的背景设置为黑色,现在控件可以工作了;我可以在不丢失按钮的情况下自由移动鼠标。但是,我真的很想在控件中有透明背景...

我有一个由 4 个按钮、一个文本块和一个独立图像组成的用户控件。这是我的 XAML 控件:

<Border BorderBrush="Transparent" MouseEnter="StackPanel_MouseEnter" MouseLeave="StackPanel_MouseLeave">
    <StackPanel Orientation="Vertical" VerticalAlignment="Center" HorizontalAlignment="Center">

        <StackPanel Orientation="Horizontal" Height="25" VerticalAlignment="Center" HorizontalAlignment="Center" >
        
            <Button Name="btnAdd" HorizontalAlignment="Center" Background="Transparent"   HorizontalContentAlignment="Left" ToolTip="Previous" Click="btnAdd_Click" 
                    BorderBrush="Transparent" >
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                    <Image Source="/Images/add.png" VerticalAlignment="Center" HorizontalAlignment="Center" Name="imgAdd" Width="25" Height="25"></Image>
                    <TextBlock Background="Transparent" Foreground="AntiqueWhite" VerticalAlignment="Center" Width="25">Add</TextBlock>
                </StackPanel>
            </Button>

            <Button Name="btnEdit" HorizontalAlignment="Center" Background="Transparent"   HorizontalContentAlignment="Left" ToolTip="Previous"
                    Click="btnAdd_Click" BorderBrush="Transparent"  >
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                    <Image Source="/Images/edit.png" VerticalAlignment="Center" HorizontalAlignment="Center" Name="imgEdit" Width="25" Height="25"></Image>
                    <TextBlock Background="Transparent" Foreground="AntiqueWhite" VerticalAlignment="Center" Width="25">Edit</TextBlock>
                </StackPanel>
            </Button>
    
        </StackPanel>


        <StackPanel Orientation="Horizontal" Height="30" >

            <Button Name="btnPrevious" HorizontalAlignment="Left" Background="Transparent"   HorizontalContentAlignment="Left" ToolTip="Previous" Click="btnPrevious_Click" BorderBrush="Transparent" >
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                    <Image Source="/Images/Previous25px.png" VerticalAlignment="Center" HorizontalAlignment="Center" Name="imgPrevious" Width="25" Height="25"></Image>
                </StackPanel>
            </Button>
        
                <TextBlock Name="tblkUserType" Background="Transparent" Foreground="AntiqueWhite"  HorizontalAlignment="Center" VerticalAlignment="Center" Width="90" >Usertype</TextBlock>
        
            <Button Name="btnNext" HorizontalAlignment="Left" Background="Transparent"   HorizontalContentAlignment="Left" ToolTip="Previous" Click="btnNext_Click" BorderBrush="Transparent">
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Left">
                    <Image Source="/Images/Next25px.png" VerticalAlignment="Center" HorizontalAlignment="Center" Name="imgNext" Width="25" Height="25"></Image>
                </StackPanel>
            </Button>

        </StackPanel>

    <Image Source="/Images/Logo50px.png" Height="50" Width="50" ></Image>

</StackPanel>
</Border>

我添加了边框以进一步测试它,之前我在顶部有 MouseEnter 和 MouseLeave 事件。

MouseEnter 和 MouseLeave 背后的代码如下:

    private void StackPanel_MouseEnter(object sender, MouseEventArgs e)
    {
        btnNext.Visibility = Visibility.Visible;
        btnPrevious.Visibility = Visibility.Visible;
        btnAdd.Visibility = Visibility.Visible;
        btnEdit.Visibility = Visibility.Visible;
        //Debug.WriteLine("mouseEnter");
    }

    private void StackPanel_MouseLeave(object sender, MouseEventArgs e)
    {
        btnNext.Visibility = Visibility.Hidden;
        btnPrevious.Visibility = Visibility.Hidden;
        btnAdd.Visibility = Visibility.Hidden;
        btnEdit.Visibility = Visibility.Hidden;
        //Debug.WriteLine("mouseLeave");
    }

当我将鼠标悬停在控件上时应该发生什么我希望按钮弹出/出现。

当我将鼠标悬停在自定义控件上并且当我导航到“btnNext”或“btnPrevious”时,4 个按钮确实出现了,控件保持“打开”状态。

如果我将光标向上移动到“btnAdd”或“btnEdit”大约一半,按钮就会消失,因为触发了 MouseLeave 事件。但是,所有这些对象都在包含 MouseEnter 和 MouseLeave 的同一个堆栈面板下。

如果我转到 btnNext 或 btnPrevious,然后将鼠标对角线移动到 btnAdd 或 btnEdit,我就可以找到按钮。但是我不能直接从 tblkUserType 开始。

我试图解决一个原始问题,即上部按钮的 1/2 方向和按钮会闪烁开/关。当我在此处添加 height="25" 时,这是“固定的”:

  <StackPanel Orientation="Horizontal" Height="25" >

但是我至少可以继续向上并到达按钮,但是看着所有闪烁的东西很痛苦。

我不知道为什么会这样,甚至不知道要搜索什么才能找到有同样问题的人...

我需要能够从 tblkUserType 访问 btnAdd 和 btnEdit。我想我错误地假设 StackPanel(或边框)内的所有内容都将在该覆盖范围内与 MouseEnter 和 MouseLeave 一起运行,但我不理解某些东西。

在发现透明背景似乎影响 StackPanel 之后,我终于在 SO 上找到了这个。这就是为我修复它的原因。