MenuItems
of からのコマンドの伝播で奇妙な動作が発生していContextMenu
ます。
私は次の種類のレイアウトを持っています:内部のそれぞれにContextMenu
設定され、その順番で AvalonDock の内部にあります。ドッキングまたはグリッドの周りを取り除けば、問題はありません。代わりに、この問題もありません。DataGridRow
DataGrid
UserControl
DockableContent
UserControl
ListBox
DataGrid
<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」(ボタン) によって処理されることを示しています。
UserControls
AvalonDock内でホストされている UI コマンドの伝搬に関して、他にも問題がありましたが、これは最も再現しやすいものです。