2013-07-03 46 views
1

我在Button上有ContextMenu,我想在MouseEnter事件上打开,而不是在默认的右键单击事件上打开。这是我的XAML:通过ContextMenus使用MouseEnter/MouseLeave事件

​​

和相关的事件处理程序:

private void Button_MouseEnter(object sender, MouseEventArgs e) 
{ 
    backButtonContextMenu.Placement = PlacementMode.Bottom; 
    backButtonContextMenu.IsOpen = true; 
    Console.WriteLine("MouseEnter called"); 
} 

private void Button_MouseLeave(object sender, MouseEventArgs e) 
{ 
    backButtonContextMenu.IsOpen = false; 
    Console.WriteLine("MouseLeave called"); 
} 

漂亮的直线前进。不幸的是,当将鼠标悬停在按钮上时,这两种方法会无限地调用,来回交替。下面是我的控制台输出的一个例子:

MouseEnter called 
MouseLeave called 
MouseEnter called 
MouseLeave called 
MouseEnter called 
MouseLeave called 
MouseEnter called 
MouseLeave called 
    ... etc. ... 

我假设这事做与文本菜单偷的焦点,当它是开放的,或者放下某种看不见的“帮手”背景下的检测何时需要关闭。有没有人有这种行为的解释,有没有办法避免它?从用户界面的角度来看,这是一个非常简单的效果。

+1

在mouseEnter上,您应该检查ContextMenu是否打开。如果它已经打开,则不应再打开它。 – Dilshod

回答

2

它进入一个循环COS被调用ContextMenuButton失去鼠标,然后关闭ContextMenu现在的鼠标再次返回到Button和你有你的循环。

你可以随便去:

private void Button_MouseLeave(object sender, MouseEventArgs e) { 
    if (backButtonContextMenu.IsMouseOver) 
    return; 
    backButtonContextMenu.IsOpen = false; 
    Debug.WriteLine("MouseLeave called"); 
} 

但是现在你得到了其在另一时刻关闭菜单的问题。

在这种情况下,当我需要一个像ContextMenu这样的菜单但没有默认行为时,我倾向于选择Popup

说有Popup同样的事情:

<StackPanel> 
    <Button x:Name="button" 
      Content="Button" /> 
    <Button x:Name="button2" 
      Content="Button 2" /> 
    <Popup Placement="Right" 
      PlacementTarget="{Binding ElementName=button}"> 
    <Menu> 
     <MenuItem Header="AAA" /> 
    </Menu> 
    <Popup.Style> 
     <Style TargetType="{x:Type Popup}"> 
     <Setter Property="IsOpen" 
       Value="True" /> 
     <Style.Triggers> 
      <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding RelativeSource={RelativeSource Self}, 
              Path=PlacementTarget.IsMouseOver}" 
          Value="False" /> 
       <Condition Binding="{Binding RelativeSource={RelativeSource Self}, 
              Path=IsMouseOver}" 
          Value="False" /> 
      </MultiDataTrigger.Conditions> 
      <Setter Property="IsOpen" 
        Value="False" /> 
      </MultiDataTrigger> 
     </Style.Triggers> 
     </Style> 
    </Popup.Style> 
    </Popup> 
</StackPanel> 

可以OFC调整它的条件,你需要什么。

+1

谢谢,我最终切换到了“Popup”。更容易使用。 –