mirror of
https://github.com/SpaceTimee/Sheas-Cealer.git
synced 2025-07-13 21:02:08 +08:00
67 lines
2.1 KiB
C#
67 lines
2.1 KiB
C#
using System;
|
|
using System.Windows;
|
|
|
|
namespace Sheas_Cealer.Utils
|
|
{
|
|
public static class FocusExtension
|
|
{
|
|
public static readonly DependencyProperty IsFocusedProperty =
|
|
DependencyProperty.RegisterAttached("IsFocused", typeof(bool?), typeof(FocusExtension), new FrameworkPropertyMetadata(IsFocusedChanged) { BindsTwoWayByDefault = true });
|
|
|
|
public static bool? GetIsFocused(DependencyObject element)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(element);
|
|
|
|
return (bool?)element.GetValue(IsFocusedProperty);
|
|
}
|
|
|
|
public static void SetIsFocused(DependencyObject element, bool? value)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(element);
|
|
|
|
element.SetValue(IsFocusedProperty, value);
|
|
}
|
|
|
|
private static void IsFocusedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
var fe = (FrameworkElement)d;
|
|
|
|
if (e.OldValue == null)
|
|
{
|
|
fe.GotFocus += FrameworkElement_GotFocus;
|
|
fe.LostFocus += FrameworkElement_LostFocus;
|
|
}
|
|
|
|
if (!fe.IsVisible)
|
|
{
|
|
fe.IsVisibleChanged += new DependencyPropertyChangedEventHandler(fe_IsVisibleChanged);
|
|
}
|
|
|
|
if (e.NewValue != null && (bool)e.NewValue)
|
|
{
|
|
fe.Focus();
|
|
}
|
|
}
|
|
|
|
private static void fe_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
var fe = (FrameworkElement)sender;
|
|
if (fe.IsVisible && (bool)fe.GetValue(IsFocusedProperty))
|
|
{
|
|
fe.IsVisibleChanged -= fe_IsVisibleChanged;
|
|
fe.Focus();
|
|
}
|
|
}
|
|
|
|
private static void FrameworkElement_GotFocus(object sender, RoutedEventArgs e)
|
|
{
|
|
((FrameworkElement)sender).SetValue(IsFocusedProperty, true);
|
|
}
|
|
|
|
private static void FrameworkElement_LostFocus(object sender, RoutedEventArgs e)
|
|
{
|
|
((FrameworkElement)sender).SetValue(IsFocusedProperty, false);
|
|
}
|
|
}
|
|
}
|