diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/NotifyIconDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/NotifyIconDemoCtl.xaml index 36c6aeac..40f5a071 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/NotifyIconDemoCtl.xaml +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/NotifyIconDemoCtl.xaml @@ -41,6 +41,7 @@ + diff --git a/src/Shared/HandyControl_Shared/Controls/Other/NotifyIcon.cs b/src/Shared/HandyControl_Shared/Controls/Other/NotifyIcon.cs index 6531ccf6..5dff7b65 100644 --- a/src/Shared/HandyControl_Shared/Controls/Other/NotifyIcon.cs +++ b/src/Shared/HandyControl_Shared/Controls/Other/NotifyIcon.cs @@ -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) { diff --git a/src/Shared/HandyControl_Shared/Tools/Extension/FrameworkElementExtension.cs b/src/Shared/HandyControl_Shared/Tools/Extension/FrameworkElementExtension.cs index 8810122d..8028f5b8 100644 --- a/src/Shared/HandyControl_Shared/Tools/Extension/FrameworkElementExtension.cs +++ b/src/Shared/HandyControl_Shared/Tools/Extension/FrameworkElementExtension.cs @@ -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; + } } } \ No newline at end of file