有没有办法将Controls.ContextMenu转换为Forms.ContextMenu?

时间:2016-04-06 21:48:28

标签: c# wpf winforms xaml contextmenu

我的WPF XAML中定义了一个上下文菜单,如下所示:

<Window.Resources>
    <ContextMenu x:Key="MyMenu">
        <MenuItem Header="{x:Static props:Resources.MenuItem1}"/>
    </ContextMenu>
</Window.Resources>

我正在使用System.Windows.Forms.NotifyIcon“myIcon”作为托盘图标,因为它的设置和使用非常简单,因为似乎没有标准的MSFT WPF等效版本。不幸的是,当我打电话

时,我得到了一个转换异常
this.myIcon.ContextMenu = (ContextMenu)this.Resources["MyMenu"];

因为它们显然不是同一个ContextMenu类。有没有办法简单地从Controls.ContextMenu转换为Forms.ContextMenu

我不希望通过手动调出我的XAML中定义的上下文菜单来处理通知图标的右键单击鼠标事件。我怀疑当用户使用键盘上的上下文菜单键时,不会发送右键单击鼠标事件。

2 个答案:

答案 0 :(得分:2)

不 - 控件适用于完全不同的平台(Winforms vs WPF)。两者之间没有“转换”。

使用支持WPF的a different version of NotifyIcon或编写转换WPF上下文菜单项的“转换”,并将它们添加到Winforms上下文菜单中。

答案 1 :(得分:1)

所以,我认为任何人都很好奇。我最终实现了一个转换器。

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

namespace MyApp
{
    class NotifyIconEx
    {
        #region Data
        private System.Windows.Forms.NotifyIcon _notifyIcon = new System.Windows.Forms.NotifyIcon();
        #endregion // Data

        #region Properties
        public Icon Icon
        {
            get { return _notifyIcon.Icon; }
            set { _notifyIcon.Icon = value; }
        }
        public ContextMenu ContextMenu
        {
            private get { return null; }
            set
            {
                _notifyIcon.ContextMenuStrip = new System.Windows.Forms.ContextMenuStrip();
                foreach (var item in value.Items)
                {
                    if (item is MenuItem)
                    {
                        var menuItem = item as MenuItem;
                        var toolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
                        toolStripMenuItem.Click += (s, e) => menuItem.RaiseEvent(new System.Windows.RoutedEventArgs(MenuItem.ClickEvent));
                        toolStripMenuItem.Text = menuItem.Header as string;
                        _notifyIcon.ContextMenuStrip.Items.Add(toolStripMenuItem);
                    }
                    else if (item is Separator)
                    {
                        _notifyIcon.ContextMenuStrip.Items.Add(new System.Windows.Forms.ToolStripSeparator());
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }
                }
            }
        }
        public bool Visible
        {
            get { return _notifyIcon.Visible; }
            set { _notifyIcon.Visible = value; }
        }
        #endregion // Properties

        #region API
        public void ShowBalloonTip(int timeout)
        {
            _notifyIcon.ShowBalloonTip(timeout);
        }
        public void ShowBalloonTip(int timeout, string tipTitle, string tipText, System.Windows.Forms.ToolTipIcon tipIcon)
        {
            _notifyIcon.ShowBalloonTip(timeout, tipTitle, tipText, tipIcon);
        }
        #endregion // API
    }
}