Добавить новые элементы контекстного меню в WindowsFormsHost, который по умолчанию имеет ContextMenu в WPF

Мы используем некоторые элементы управления ActiveX или формы Windows, которые не имеют эквивалентов WPF, поэтому, естественно, мы используем WindowsFormsHost для размещения этих элементов управления. Обычно мы делаем из него UserControl с некоторыми общими элементами управления, такими как кнопка, для реализации общей функциональности. Одна часть кода xaml выглядит примерно так:

<WindowsFormsHost Name="windowsFormsHost1" >   
    <WindowsFormsHost.ContextMenu>
        <ContextMenu>                    
            <MenuItem Header="_Test1" />
        </ContextMenu>                    
    </WindowsFormsHost.ContextMenu>

    <AxOWC:AxPivotTable x:Name="pivotTable" />        
</WindowsFormsHost>        
....

AxPivotTable - это элемент управления OWC (офисный веб-компонент). В другом UserControl мы добавляем ReportViewer внутри WindowsFormsHost. Обратите внимание, что обычно AxPivotTable или ReportViewer имеет свое контекстное меню по умолчанию даже без добавления какого-либо элемента ContextMenu.

Пока что мое настроенное ContextMenu пока не отображается (по-прежнему отображается по умолчанию). Благодаря этому вопросу я понял, что мне все еще нужно захватить событие нажатия мыши в коде и установить

windowsFormsHost1.ContextMenu.IsOpen = True

показать контекстное меню (хотя и странно).

Теперь моя проблема в том, что только этот Test1 ContextMenu находится здесь сейчас. ContextMenu по умолчанию больше не будет отображаться. Как я уже упоминал, мы хотим добавить настраиваемые поверх этих контекстных меню по умолчанию.

1 ответ

Это будет мое рабочее "решение" для вашего примера выше, я не знаю, нужно ли вам это также для дочерних элементов из вашего WindowsFormsHost, Надеюсь, что это поможет вам

XAML

<Window x:Class="tete.MainWindow"
        xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
        xmlns="http://schemas.microsoft.com/netfx/2009/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms">
    <Grid>
        <av:WindowsFormsHost Name="myWFH">
            <wf:ComboBox Name="myCBox">
            <wf:ComboBox.ContextMenu>
                <wf:ContextMenu>
                    <wf:ContextMenu.MenuItems>
                        <wf:MenuItem Text="somet"/>
                    </wf:ContextMenu.MenuItems>
                </wf:ContextMenu>
            </wf:ComboBox.ContextMenu>
        </wf:ComboBox>

    </Grid>
</Window>

Code-Behind

using System.Windows;
using System.Windows.Controls;

namespace tete
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

        var child = myWFH.Child as System.Windows.Forms.ComboBox;
        child.ContextMenu.MenuItems.Add(new System.Windows.Forms.MenuItem("my new menuitem"));
        }
    }
}

РЕДАКТИРОВАТЬ Я надеюсь, что теперь это соответствует вашим потребностям:) и я правильно понимаю, что вы хотите ToDo

Другие вопросы по тегам