7

次のようなユーザー コントロールがあります。

<UserControl x:Class="MyApp.UserControls.MyContextMenu"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d"
             ContextMenuOpening="OnContextMenuOpening"
             d:DesignHeight="300" d:DesignWidth="300">

    <UserControl.ContextMenu>
        <ContextMenu>
        ...
        </ContextMenu>
    </UserControl.ContextMenu>
</UserControl>

私の質問は、データ グリッドのようなものにそのコンテキスト メニューをどのように使用するかです。

<DataGrid ContextMenu="{usercontrols:MyContextMenu}"

残念ながら、指定された値が正しくなく、ContextMenu.

注:いくつかの場所でコンテキスト メニューを再利用する必要があるため、独自のファイルに入れました。OnContextMenuOpeningまた、メニューを開いたときにメニューに関するいくつかの作業を行う必要があり、残念ながらコンテキストメニューに対してイベントが発生しないため、イベントをリッスンできる必要があります: http://connect.microsoft.com/VisualStudio/feedback /details/353112/contextmenu-opening-event-doesnt-fire-properly

「ContextMenu 自体は FrameworkElement 派生クラスですが、このイベントは、ソースとして開かれているコンテキスト メニューからは発生しません。このイベントは、コンテキスト メニューをプロパティとして "所有" する要素から発生し、ユーザーがUI でコンテキスト メニューを開こうとしています。」

このイベントの問題が、ユーザー コントロールのメニューを配置した理由です。これにより、ユーザー コントロールはイベントを取得して作業を行うことができます。

更新:ルート要素として使用し、コンテキスト メニューを拡張しようとしました:

ここに画像の説明を入力

コードビハインド:

ここに画像の説明を入力

しかし、私は得ています: ContextMenu cannot have a logical or visual parent.

4

2 に答える 2

8

UserControlの呼び出し方法に関係なく、これはContextMenuではありません。UserControlではなくContextMenuから派生する必要があります。

<ContextMenu x:Class="MyApp.MyContextMenu"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <MenuItem Header="Item 1"/>
    <MenuItem Header="Item 2"/>
    ...
</ContextMenu>

public partial class MyContextMenu : ContextMenu
{
    public MyContextMenu()
    {
        InitializeComponent();
    }
}

しかし、なぜあなたはそれをするのですか?

于 2012-05-17T12:08:47.703 に答える
5

次のように定義してみてください。

<DataGrid.Resources>
    <ContextMenu x:Key="DgContextMenu">
      ...
    </ContextMenu>
</DataGrid.Resources>

使用後は

<DataGrid ContextMenu="{StaticResource DgContextMenu}

動作するはずです。

于 2012-05-17T12:09:01.823 に答える