C#WPF onMouseCenter和OnMouseLeave循环

C#WPF onMouseCenter和OnMouseLeave循环,c#,wpf,C#,Wpf,我有WPF UI元素,当鼠标光标进入该元素时,这些元素应该隐藏,当鼠标光标离开该元素时,这些元素应该可见。为此,我使用事件OnMouseEnter和onmouseeve,如下所示: private void TextBlock_MouseEnter(object sender, MouseEventArgs e) { (e.Source as UIElement).Visibility = Visibility.Hidden; } private void TextBlock_Mous

我有WPF UI元素,当鼠标光标进入该元素时,这些元素应该隐藏,当鼠标光标离开该元素时,这些元素应该可见。为此,我使用事件
OnMouseEnter
onmouseeve
,如下所示:

private void TextBlock_MouseEnter(object sender, MouseEventArgs e)
{
    (e.Source as UIElement).Visibility = Visibility.Hidden;
}

private void TextBlock_MouseLeave(object sender, MouseEventArgs e)
{
    (e.Source as UIElement).Visibility = Visibility.Visible;
}
(以下代码来自)


但当我运行程序并将光标悬停在元素上时

调试显示,当我将光标悬停在元素上时,直到我将光标移离元素为止

我看到了,但我不明白附加在那里的解决方案

我需要做什么来防止这些事件循环?

重复设置相同的值可能会导致“绘制事件”,请尝试此操作,看看您是否满意

private void TextBlock_MouseEnter(object sender, MouseEventArgs e)
{
   if(e.Source is UIElement element && element.Visibility != Visibility.Hidden )
   {
     element.Visibility = Visibility.Hidden;
   }   
}

当您将UIElement的可见性更改为Hidden时,实际上是在触发MouseLeave事件,因为现在对其后面的元素执行鼠标点击测试。这将运行事件处理程序,将可见性设置为Visible,然后触发MouseEnter事件。因此闪烁

解决这个问题的一个方法是使用不透明度而不是可见性。尝试:

private void TextBlock_MouseEnter(object sender, MouseEventArgs e)
{
  (e.Source as UIElement).Opacity = 0;
}

private void TextBlock_MouseLeave(object sender, MouseEventArgs e)
{
  (e.Source as UIElement).Opacity = 1;
}

不,它不起作用。元素。可见性!=Visibility.Hidden将始终为true,因为事件循环(visible->Hidden->visible->visible->…)不应在您输入它一次后,直到您离开它。它必须是一个代码吗?为什么不使用XAML功能来解决它呢?类似或通过在鼠标光标进入时隐藏元素,鼠标不再位于(现在已隐藏)元素上,从而触发MouseLeave事件,依此类推。
private void TextBlock_MouseEnter(object sender, MouseEventArgs e)
{
  (e.Source as UIElement).Opacity = 0;
}

private void TextBlock_MouseLeave(object sender, MouseEventArgs e)
{
  (e.Source as UIElement).Opacity = 1;
}