3

MenuItemsof からのコマンドの伝播で奇妙な動作が発生していContextMenuます。

私は次の種類のレイアウトを持っています:内部のそれぞれにContextMenu設定され、その順番で AvalonDock の内部にあります。ドッキングまたはグリッドの周りを取り除けば、問題はありません。代わりに、この問題もありません。DataGridRowDataGridUserControlDockableContentUserControlListBoxDataGrid

<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>

コード ビハインドも簡単です。

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

ここに問題があります。選択した行を右クリックすると (右クリックする前に選択されていた場合)、コマンドが無効になります。この場合、コマンドは「ズーム」ですが、カスタムのものを含め、他のコマンドにすることもできます。

ここで何が問題なのかわかりません。SNOOP は、この伝播が失敗した場合、 ではなく、UserControlドッキングCanExecuteヘッダーの一部である「PART_ShowContextMenuButton」(ボタン) によって処理されることを示しています。

UserControlsAvalonDock内でホストされている UI コマンドの伝搬に関して、他にも問題がありましたが、これは最も再現しやすいものです。

4

1 に答える 1

2

ContextMenu はポップアップであるため、FocusScope 添付プロパティが true に設定されています。

MSDNから

フォーカス スコープは、そのスコープ内で FocusManager..::.FocusedElement を追跡するコンテナー要素です。デフォルトでは、Window クラスは、Menu、ContextMenu、および ToolBar クラスと同様にフォーカス スコープです。フォーカス スコープである要素の IsFocusScope が false に設定されています。

基本的に、これはビジュアル ツリー内のそれ以上の検索を停止するコマンドにも指示します。

したがって、2つのオプションがあります

  1. FocusManager.IsFocusScope="True"コンテキスト メニュー オブジェクトに を設定します

  2. または、次のように UserControl の代わりに ContextMenu にバインドされるように、コマンド バインドを移動します。

コードサンプル:

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

お役に立てれば!:)

インターウェブ上のフィールドからのいくつかのFocusScopeの悪夢の物語:

于 2010-05-21T13:33:09.760 に答える