2016-04-06 5 views
1

Ich habe ein Kontextmenü in meinem WPF XAML definiert, die wie folgt aussieht:Gibt es eine Möglichkeit, ein Controls.ContextMenu in ein Forms.ContextMenu zu konvertieren?

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

Ich bin ein System.Windows.Forms.NotifyIcon „MyIcon“ für meinen Tray-Icon verwenden, weil es zu Setup so trivial ist und verwenden und weil es scheint kein Standard MSFT WPF-Äquivalent sein. Leider bekomme ich eine Casting Ausnahme, wenn ich

this.myIcon.ContextMenu = (ContextMenu)this.Resources["MyMenu"]; 

nennen, weil sie offensichtlich nicht die gleiche ContextMenu Klasse ist. Gibt es eine Möglichkeit, einfach von der Controls.ContextMenu in eine Forms.ContextMenu zu konvertieren?

Ich würde es vorziehen, nicht mit dem Rechtsklickmaus-Ereignis des Benachrichtigungssymbols umzugehen, indem ich das in meinem XAML definierte Kontextmenü manuell öffne. Der Grund dafür ist vermutlich, dass das Rechtsklick-Maus-Ereignis nicht gesendet wird, wenn der Benutzer die Kontextmenütaste auf der Tastatur verwendet.

Antwort

2

Nein - die Steuerelemente sind für völlig unterschiedliche Plattformen (Winforms vs WPF). Es gibt keine "Umwandlung" zwischen den beiden. Verwenden Sie a different version of NotifyIcon, das WPF unterstützt, oder schreiben Sie eine "Konvertierung", die die Elemente des WPF-Kontextmenüs übersetzt und sie dem Winforms-Kontextmenü hinzufügt.

1

Also, ich denke, jeder ist neugierig. Ich habe schließlich einen Konverter implementiert.

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 
    } 
} 
Verwandte Themen