NotifiIcon的ContextMenu -> MenuItem -> Command 可以使用绑定
This commit is contained in:
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user