/ /コンテキストメニュー項目は、2番目の右クリックでのみ正しく表示されます-c#、wpf、xaml、treeview、contextmenu

コンテキストメニュー項目は、2回目の右クリックで正しく表示されます - c#、wpf、xaml、treeview、contextmenu

アイテムが収集されるツリービューがありますいくつかのxmlファイルから。次に、選択されたツリービュー項目に応じて、カスタムコンテキストメニューが表示されます。これで説明されているように問題にぶつかっていると思うことを除いて、これはすべてうまくいきます MSDN記事.

記事で説明されている回避策を使用して何かを見逃しているに違いありませんが、正確にはそれが何であるかがわかりません。

ツリービューアイテムを右クリックすると(この場合、「クライアント」と呼ばれるルートツリービューアイテムに焦点を当てています。最初の右クリックでコンテキストメニューが表示され、メニューアイテムのテキストは「これは置き換えられます」です。もう一度右クリックすると、表示されるコンテキストメニューが目的の「新しいグループの追加」になります。ここからは、新しいグループに入るためのウィンドウを起動するなどの点ですべて機能します。

私はまた、提案されているように、contextmenuはnullであるため、おそらくこれが欠落しています。回避策について私が見逃していることについての指示やコメントをいただければ幸いです。

ツリービューのXAML:

 <TreeView x:Name="TreeViewDisplay"
Grid.Row="0"
Grid.Column="0"
DockPanel.Dock="Left"
Margin="5 5 0 5"
MinWidth="180"
SelectedItemChanged="TreeViewDisplay_SelectedItemChanged"
ContextMenuOpening="treeviewContextMenu_ContextMenuOpening">
<TreeView.ContextMenu>
<ContextMenu x:Name="treeviewContextMenu"
Style="{StaticResource baseControlStyle}" >
<MenuItem Header="This will be replaced." />
</ContextMenu>
</TreeView.ContextMenu>
</TreeView>

コードの背後にある:

        private void treeviewContextMenu_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
FrameworkElement fe = e.Source as FrameworkElement;

TreeViewItem selectedTreeViewItem = e.Source as TreeViewItem;
string selectedTreeViewItemHeader = selectedTreeViewItem.Header.ToString();

if (selectedTreeViewItemHeader == "Clients")
{
fe.ContextMenu = TreeViewContextMenuIfTopLevelSelected();
}
else
{
MessageBox.Show("no menu to display");
}
}

ContextMenu TreeViewContextMenuIfTopLevelSelected()
{
// This is the menu that will show if the top level treeview item is selected
ContextMenu topLevelMenu = new ContextMenu();

// Define menu items
MenuItem addNewGroup = new MenuItem();
addNewGroup.Header = "Add New Group";
addNewGroup.Click += addNewGroup_Click;

// add menuitems defined above to the menu
topLevelMenu.Items.Add(addNewGroup);
return topLevelMenu;
}

void addNewGroup_Click(object sender, RoutedEventArgs e)
{
AddNewGroup newGroupAdd = new AddNewGroup();

newGroupAdd.Closed += new EventHandler(RefreshTreeView);
newGroupAdd.Show();
}

private void RefreshTreeView(object sender, EventArgs e)
{
TreeViewDisplay.Items.Clear();
GetTreeViewGroupList();
}

回答:

回答№1は0

私はこれを理解することができました。これを行うためのより雄弁な方法があるかもしれませんが、それは私の目的のために働いた。

ContextMenuOpeningイベントを次のように変更しました。

    private void treeviewContextMenu_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
FrameworkElement fe = e.Source as FrameworkElement;

TreeViewItem selectedTreeViewItem = e.Source as TreeViewItem;
string selectedTreeViewItemHeader = selectedTreeViewItem.Header.ToString();

if (fe.ContextMenu != null)
{
if (selectedTreeViewItemHeader == "Clients")
{
fe.ContextMenu = TreeViewContextMenuIfTopLevelSelected();
}
else
{
MessageBox.Show("no menu to display");
}
}
else
{
e.Handled = true;

if (selectedTreeViewItemHeader == "Clients")
{
fe.ContextMenu = TreeViewContextMenuIfTopLevelSelected();
fe.ContextMenu.IsOpen = true;
}
else
{
fe.ContextMenu = TreeViewContextMenu();
fe.ContextMenu.IsOpen = true;
}
}
}