NotifiIcon的ContextMenu -> MenuItem -> Command 可以使用绑定

This commit is contained in:
yxhq committed 2020-03-13 21:27:42 +08:00
1 parent 1abbedcbe0
commit a53f495d7d
3 files changed
+54 -10

No files matched your search

@@ -41,6 +41,7 @@
<hc:NotifyIcon Token="{x:Static data:MessageToken.NotifyIconDemo}" Text="HandyControl" IsBlink="{Binding ContextMenuIsBlink}" Visibility="{Binding ContextMenuIsShow,Converter={StaticResource Boolean2VisibilityConverter}}">
<hc:NotifyIcon.ContextMenu>
<ContextMenu>
<MenuItem Command="{Binding SendNotificationCmd}" Header="{x:Static langs:Lang.SendNotification}"/>
<MenuItem Command="hc:ControlCommands.PushMainWindow2Top" Header="{x:Static langs:Lang.OpenPanel}"/>
<MenuItem Command="hc:ControlCommands.ShutdownApp" Header="{x:Static langs:Lang.Exit}"/>
</ContextMenu>
@@ -11,6 +11,7 @@ using System.Windows.Media;
using System.Windows.Threading;
using HandyControl.Data;
using HandyControl.Tools;
using HandyControl.Tools.Extension;
using HandyControl.Tools.Interop;
namespace HandyControl.Controls
@@ -62,11 +63,13 @@ namespace HandyControl.Controls
static NotifyIcon()
{
VisibilityProperty.OverrideMetadata(typeof(NotifyIcon), new PropertyMetadata(Visibility.Visible, OnVisibilityChanged));
DataContextProperty.OverrideMetadata(typeof(NotifyIcon), new FrameworkPropertyMetadata(DataContextPropertyChanged));
ContextMenuProperty.OverrideMetadata(typeof(NotifyIcon), new FrameworkPropertyMetadata(ContextMenuPropertyChanged));
}
private static void OnVisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var ctl = (NotifyIcon) d;
var ctl = (NotifyIcon)d;
var v = (Visibility)e.NewValue;
if (v == Visibility.Visible)
@@ -77,11 +80,35 @@ namespace HandyControl.Controls
}
ctl.UpdateIcon(true);
}
else if(ctl._iconCurrentHandle != IntPtr.Zero)
else if (ctl._iconCurrentHandle != IntPtr.Zero)
{
ctl.UpdateIcon(false);
}
}
private static void DataContextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
NotifyIcon owner = (NotifyIcon)d;
owner.OnDataContextPropertyChanged(e);
}
private void OnDataContextPropertyChanged(DependencyPropertyChangedEventArgs e)
{
object newValue = e.NewValue;
object oldValue = e.OldValue;
UpdateDataContext(_contextContent, oldValue, newValue);
UpdateDataContext(ContextMenu, oldValue, newValue);
}
private static void ContextMenuPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
NotifyIcon owner = (NotifyIcon)d;
owner.OnContextMenuPropertyChanged(e);
}
private void OnContextMenuPropertyChanged(DependencyPropertyChangedEventArgs e)
{
UpdateDataContext((ContextMenu)e.NewValue, null, DataContext);
}
public NotifyIcon()
{
@@ -228,7 +255,7 @@ namespace HandyControl.Controls
public string Token
{
get => (string) GetValue(TokenProperty);
get => (string)GetValue(TokenProperty);
set => SetValue(TokenProperty, value);
}
@@ -237,7 +264,7 @@ namespace HandyControl.Controls
public string Text
{
get => (string) GetValue(TextProperty);
get => (string)GetValue(TextProperty);
set => SetValue(TextProperty, value);
}
@@ -274,13 +301,13 @@ namespace HandyControl.Controls
var ctl = (NotifyIcon)d;
if (ctl._dispatcherTimerBlink != null)
{
ctl._dispatcherTimerBlink.Interval = (TimeSpan) e.NewValue;
ctl._dispatcherTimerBlink.Interval = (TimeSpan)e.NewValue;
}
}
public TimeSpan BlinkInterval
{
get => (TimeSpan) GetValue(BlinkIntervalProperty);
get => (TimeSpan)GetValue(BlinkIntervalProperty);
set => SetValue(BlinkIntervalProperty, value);
}
@@ -291,7 +318,7 @@ namespace HandyControl.Controls
{
var ctl = (NotifyIcon)d;
if (ctl.Visibility != Visibility.Visible) return;
if ((bool) e.NewValue)
if ((bool)e.NewValue)
{
if (ctl._dispatcherTimerBlink == null)
{
@@ -465,7 +492,7 @@ namespace HandyControl.Controls
InteropMethods.VirtualFreeEx(hProcess, address, 0, InteropValues.FreeType.Release);
InteropMethods.CloseHandle(hProcess);
}
return isFind;
return isFind;
}
private void OnIconChanged()
@@ -674,7 +701,16 @@ namespace HandyControl.Controls
{
add => AddHandler(MouseDoubleClickEvent, value);
remove => RemoveHandler(MouseDoubleClickEvent, value);
}
}
private void UpdateDataContext(FrameworkElement target, object oldDataContextValue, object newDataContextValue)
{
if (target == null || target.IsDataContextDataBound()) return;
if (ReferenceEquals(this, target.DataContext) || Equals(oldDataContextValue, target.DataContext))
{
target.DataContext = newDataContextValue ?? this;
}
}
private void Dispose(bool disposing)
{
@@ -1,4 +1,5 @@
using System.Windows;
using System;
using System.Windows;
namespace HandyControl.Tools.Extension
{
@@ -54,5 +55,11 @@ namespace HandyControl.Tools.Extension
return 0;
}
public static bool IsDataContextDataBound(this FrameworkElement element)
{
if (element == null) throw new ArgumentNullException(nameof(element));
return element.GetBindingExpression(FrameworkElement.DataContextProperty) != null;
}
}
}