Search code examples
c#wpfwinformsxamlwinforms-interop

How to fill ContextMenuStrip in XAML?


I've created WPF application with NotifyIcon to work in tray.

public partial class MainWindow : Window
{
    public NotifyIcon NotifyIcon { get; } = new NotifyIcon
    {
        Icon = Properties.Resources.status_on_ico,
        Visible = true
    };

    public MainWindow()
    {
        InitializeComponent();

        NotifyIcon.ContextMenuStrip = MyContextMenuStrip;
        NotifyIcon.Click += NotifyIcon_Click;
    }

    private void Window_Closing(object sender, CancelEventArgs e)
    {
        e.Cancel = true;
        WindowState = WindowState.Minimized;
    }

    private void NotifyIcon_Click(object sender, EventArgs e)
    {
        Show();
    }
}

XAML of main window is nothing special and not relevant.

I want to create ContextMenuStrip of NotifyIcon in XAML (I know how to do it code behind but don't want it).

Here is what I've managed.

<WindowsFormsHost>
    <wf:ContextMenuStrip x:Name="MyContextMenuStrip" TopLevel="False">
        <wf:ContextMenuStrip.Items>
            <!-- How to add items here? -->
        </wf:ContextMenuStrip.Items>
    </wf:ContextMenuStrip>
</WindowsFormsHost>

The question is how to add items to ContextMenuStrip.Items with Name and Click event handlers in XAML?


Solution

  • The question is how to add items to ContextMenuStrip.Items with Name and Click event handlers in XAML?

    Try this:

    <WindowsFormsHost>
        <wf:ContextMenuStrip x:Name="MyContextMenuStrip" TopLevel="False">
            <wf:ContextMenuStrip.Items>
                <wf:ToolStripMenuItem Text="test1" Click="It_Click" />
                <wf:ToolStripMenuItem Text="test2" />
            </wf:ContextMenuStrip.Items>
        </wf:ContextMenuStrip>
    </WindowsFormsHost>
    

    private void It_Click(object sender, EventArgs e)
    {
        MessageBox.Show("click!");
    }