2010-05-14 4 views
3

MenuItemsContextMenu 인 명령 전파에 이상한 동작이 나타납니다. ContextMenuUserControl 내부 DataGrid의 각 DataGridRow 설정되어, 나아가서 내부 AvalonDock의 DockableContent입니다 :AvalonDock + UserControl + DataGrid + ContextMenu 명령 라우팅 문제

나는 레이아웃의 다음과 같은 종류가 있습니다. 을 제거하면 도킹 또는 UserControl 내 눈금 주위에 문제가 없습니다. DataGrid 대신 ListBox에이 문제가 없습니다. 그래서 여기

public partial class MainWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     _evilGrid.ItemsSource = 
      new[] 
       { 
        Tuple.Create(1, 2, 3), 
        Tuple.Create(4, 4, 3), 
        Tuple.Create(6, 7, 1), 
       }; 
    } 

    private void ExecuteZoom(object sender, ExecutedRoutedEventArgs e) 
    { 
     MessageBox.Show("zoom !"); 
    } 

    private void CanZoom(object sender, CanExecuteRoutedEventArgs e) 
    { 
     e.CanExecute = true; 
    } 
} 

문제입니다 :

<Window x:Class="DockAndMenuTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:ad="clr-namespace:AvalonDock;assembly=AvalonDock" 
     Title="MainWindow" Height="350" Width="525"> 
    <ad:DockingManager> 
     <ad:DocumentPane> 
      <ad:DockableContent Title="Doh!"> 
       <UserControl> 
        <UserControl.CommandBindings> 
         <CommandBinding Command="Zoom" 
             Executed="ExecuteZoom" 
             CanExecute="CanZoom"/> 
        </UserControl.CommandBindings> 
        <DataGrid Name="_evilGrid"> 
         <DataGrid.Resources> 
          <Style TargetType="DataGridRow"> 
           <Setter Property="ContextMenu"> 
            <Setter.Value> 
             <ContextMenu> 
              <MenuItem Command="Zoom"/> 
             </ContextMenu> 
            </Setter.Value> 
           </Setter> 
          </Style> 
         </DataGrid.Resources> 
        </DataGrid> 
       </UserControl> 
      </ad:DockableContent> 
     </ad:DocumentPane> 
    </ad:DockingManager> 
</Window> 

숨김 코드는 사소한뿐만 아니라입니다 (이 경우는 마우스 오른쪽 버튼을 클릭하기 전에 선택한) 내 명령이 비활성화 나오는 선택한 행을 마우스 오른쪽 버튼으로 클릭 . 이 경우 명령은 "확대/축소"되지만 사용자 정의 커맨드를 포함하여 다른 명령이 될 수 있습니다.

여기에 무엇이 잘못 됐는지 나는 알지 못합니다. SNOOP는이 전파가 실패한 경우 UserControl 대신 CanExecute이 도킹 헤더의 일부인 "PART_ShowContextMenuButton"(Button)에 의해 처리됨을 보여줍니다.

나는 AvalonDock 내부에서 호스팅되는 UserControls 내의 UI 명령 전파와 관련하여 다른 문제가 있었지만이 중 하나를 재현하는 것이 가장 쉽습니다.

답변

2

의 ContextMenu이 팝업하고 같은 것이 true로 설정 FocusScope 연결된 속성 가지고

초점 범위가 FocusManager를 추적하는 컨테이너 요소 이다

MSDN 가입일 .. 포커스 범위가 인 FocusedElement. 기본적으로 창 클래스는 메뉴, ContextMenu 및 ToolBar 클래스와 마찬가지로 포커스 범위입니다. 포커스가있는 요소 에는 IsFocusScope가 false로 설정되어 있습니다.

기본적으로 시각적 트리에서 더 이상 보이지 않는 명령도 있습니다.

그래서 두 가지 옵션이

  1. 이 당신의 상황에 맞는 메뉴 개체

  2. 또는 당신이 대신에서의 ContextMenu에 바인딩 있도록 명령 바인딩을 이동에 FocusManager.IsFocusScope="True"를 설정해야 UserControl like :

코드 샘플 :

<ContextMenu FocusManager.IsFocusScope="False"> 
    <ContextMenu.CommandBindings> 
     <CommandBinding Command="Zoom" 
       Executed="ExecuteZoom" 
       CanExecute="CanZoom"/> 
    </ContextMenu.CommandBindings> 
     <MenuItem Command="Zoom"/> 
</ContextMenu> 

희망이 있습니다.: 인터 웹에 필드에서

일부 FocusScope 악몽 이야기 :

+0

정확히 이렇게 문제가 해결되지 않았지만, 몇 후 더 많은 시간을 파고 내 사건에 대한 해결책을 찾았습니다. UserControl 수준 ( ...)에서 포커스 범위를 만들었으며 명령 이벤트가 제대로 라우팅되고 있습니다. 올바른 방향으로 나를 가리켜 주셔서 감사합니다. – repka

+0

오우 아 죄송합니다 ... 나는 대답을 바꿀 것이다;) – Arcturus