2013-07-03 3 views
1

기본 마우스 오른쪽 버튼 클릭 이벤트 대신 MouseEnter 이벤트에서 열고 싶은 ButtonContextMenu이 있습니다.ContextMenus에서 MouseEnter/MouseLeave 이벤트 사용

<Button Content="Button" MouseEnter="Button_MouseEnter" MouseLeave="Button_MouseLeave"> 
    <Button.ContextMenu> 
     <ContextMenu> 
      .... context menu items .... 
     </ContextMenu> 
    </Button.ContextMenu> 
</Button> 

그리고 관련 이벤트 핸들러 : 꽤 똑바로 앞으로

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"); 
} 

여기 내 XAML입니다. 불행히도 버튼 위로 마우스를 가져 가면이 두 메서드가 앞뒤로 번갈아 호출됩니다. 여기 내 콘솔 출력의 예 :

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

나는이 열려 때 초점을 훔치는의 ContextMenu 함께 할 수있는 뭔가가 있으리라 믿고있어가, 혹은 감지하는 눈에 보이지 않는 '도우미 "배경의 어떤 종류를 내려 놓고 언제 닫아야 하는가? 누구나이 동작에 대한 설명을 가지고 있으며이를 피할 수있는 방법이 있습니까? 이것은 UI 관점에서 볼 때 매우 간단한 효과입니다. ContextMenu가 호출 될 때 사이클 COS에 무슨 일

+1

mouseEnter에서 ContextMenu가 열려 있는지 여부를 확인해야합니다. 이미 열려 있으면 다시 열지 마십시오. – Dilshod

답변

2

Button는 다시 한번 ContextMenu 이제 마우스를 닫으면 Button에 반환하는 동안 마우스를 푼다 당신은 당신의 루프를 얻었다. 그러나 지금

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

을 다른 순간에 메뉴를 종료해야하는 문제를 가지고 :

그냥 갈 수 있습니다.

그런 경우에는 ContextMenu과 같은 메뉴가 필요하지만 기본 동작이 아니라면 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 당신이 필요로의 조건을 조정할 수 있습니다

Popup과 같은 일을 말한다.

+1

고마워, 나는 결국 팝업으로 전환했다. 함께 일하기가 훨씬 쉽다. –