2013-07-03 47 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」。更容易使用。 –