WPF 窗体 DataGridView 上下文菜单

WPF Forms DataGridView ContextMenu

我正在尝试向 Forms.DataGridView 添加上下文菜单。 我的尝试在 <wf:MenuItem Text="Save" Click="menuFEInsertLine_Click"> 处失败,告诉我无法将 MenuItem 添加到 MenuItemCollection。而且 String 也是预期的。 我怎样才能让这个 xaml 工作?

<WindowsFormsHost Name="wfhFileEditorWindow" DockPanel.Dock="Top" HorizontalAlignment="Stretch" AllowDrop="True" Background="White" VerticalAlignment="Stretch">
    <WindowsFormsHost.Child>
        <local:DataGridViewEx x:Name="dgFileEditorWindow" AllowDrop="True" BackColor="White" BackgroundColor="White">
            <local:DataGridViewEx.ContextMenu>
                <wf:ContextMenu>
                    <wf:ContextMenu.MenuItems>
                        <wf:MenuItem Text="Save" Click="menuFEInsertLine_Click">
                            <wf:MenuItem.Icon>
                                <Image Source="star.png"/>
                            </wf:MenuItem.Icon>
                        </wf:MenuItem>
                        <wf:MenuItem Header="Save" Click="menuFEDeleteLine_Click">
                            <MenuItem.Icon>
                                <Image Source="delete.png"/>
                            </MenuItem.Icon>
                        </wf:MenuItem>

我通过覆盖 DataGridView 的两个方法解决了这个问题:

Private Sub dataGridView_MouseClick(ByVal sender As Object,
    ByVal e As System.Windows.Forms.MouseEventArgs
    ) Handles Me.MouseClick
    If e.Button = Forms.MouseButtons.Right Then

        Dim m As New Forms.ContextMenu()

        Dim hi As HitTestInfo = Me.HitTest(e.X, e.Y)

        If hi.RowIndex >= 0 Then
            m.MenuItems.Add(New Forms.MenuItem("Insert Line", AddressOf CType(Application.Current.MainWindow, MainWindow).menuFEInsertLine_Click))
        End If

        If hi.ColumnIndex >= 0 Then
            If hi.RowIndex >= 0 Then
                m.MenuItems.Add("-")
            End If
            m.MenuItems.Add(New Forms.MenuItem("Insert Column", AddressOf CType(Application.Current.MainWindow, MainWindow).menuFEInsertColumn_Click))
        End If

        m.Show(Me, New System.Drawing.Point(e.X, e.Y))
    End If
End Sub

Private Sub dataGridView_MouseMove(ByVal sender As Object,
    ByVal e As System.Windows.Forms.MouseEventArgs
    ) Handles Me.MouseMove

    Try
        Dim hi As HitTestInfo = Me.HitTest(e.X, e.Y)
        If hi IsNot Nothing Then
            Me.SetCurrentCellAddressCore(hi.ColumnIndex, hi.RowIndex, False, False, False)
        End If
    Catch ex As System.ArgumentOutOfRangeException
    End Try
End Sub