2using System.Windows.Controls;
3using System.Windows.Data;
4using System.Windows.Documents;
5using System.Windows.Input;
6using System.Windows.Media;
7using System.Windows.Threading;
8using Dreamine.UI.Abstractions.VirtualKeyboard;
45 #region Global Property
78 public static Action<DependencyObject, VkLayout, DreamineVirtualKeyboardWindow>?
SetBindingAction {
get;
set; } =
null;
82 #region Dependency Property
84 #region Layout Property
95 DependencyProperty.RegisterAttached(
99 new PropertyMetadata(
default(VkLayout)));
133 public static VkLayout
GetLayout(DependencyObject obj) =>
168 public static void SetLayout(DependencyObject obj, VkLayout value) =>
173 #region UseVirtualKeyBoard Property
184 DependencyProperty.RegisterAttached(
185 "UseVirtualKeyBoard",
262 #region Minimum Property
273 DependencyProperty.RegisterAttached(
277 new PropertyMetadata(decimal.MinValue));
311 public static void SetMinimum(DependencyObject obj, decimal value) =>
351 #region Maximum Property
362 DependencyProperty.RegisterAttached(
366 new PropertyMetadata(decimal.MaxValue));
400 public static void SetMaximum(DependencyObject obj, decimal value) =>
440 #region DecimalFormat Property
451 DependencyProperty.RegisterAttached(
455 new PropertyMetadata(
string.Empty));
529 #region DreamineVkbIconAdorner Property
540 DependencyProperty.RegisterAttached(
542 new PropertyMetadata(
null));
621 DependencyProperty.RegisterAttached(
731 if (d is not UIElement el)
return;
733 #pragma warning disable CS1587
746 var layer = AdornerLayer.GetAdornerLayer(el);
747 if (layer ==
null)
return;
749 bool visible = (bool)e.NewValue;
766 layer.Remove(current);
771 #pragma warning restore CS1587
773 if (d is FrameworkElement fe)
781 RoutedEventHandler? h =
null;
793 el.Dispatcher.InvokeAsync(Apply, DispatcherPriority.Loaded);
801 #region Action Provider Property
812 DependencyProperty.RegisterAttached(
813 "EnterActionProvider",
814 typeof(IEnterActionProvider),
914 if (e.NewValue is IEnterActionProvider provider)
916 provider.PlacementTarget = d;
940 #region Event Handlers
968 if (!(e.NewValue is
bool enabled) || d is not UIElement ui)
return;
1020 var isEnable = (bool)e.NewValue;
1054 if (sender is DependencyObject d)
1094 var isVisible = (bool)e.NewValue;
1135 #region Public Methods
1192 if (placementTarget is
null)
1237 if (placementTarget is not UIElement uIElement || AdornerLayer.GetAdornerLayer(uIElement) is not { } adornerLayer)
1245 vkbIcon.SetPreviewMouseDownAction((_, _) =>
1249 adornerLayer.Add(vkbIcon);
1256 adornerLayer.Remove(vkbIcon);
1311 if (layout == VkLayout.Password)
1315 virtualKeyboardWindow.
SetBinding(pwdBinding);
1319 if (placementTarget is PasswordBox)
1329 if (placementTarget is TextBox textBox)
1331 var binding =
new Binding(
"Text")
1334 Mode = BindingMode.TwoWay,
1335 UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
1343 case VkLayout.Numeric:
1344 virtualKeyboardWindow.
SetBinding(binding, Math.Max(
int.MinValue, (
int)min), Math.Min(
int.MaxValue, (
int)max));
1347 case VkLayout.Decimal:
1349 virtualKeyboardWindow.
SetBinding(binding, min, max, decimalFormat);
1364 if (placementTarget is PasswordBox)
1417 var type = target.GetType();
1419 var clrProp = type.GetProperty(
"Password");
1420 if (clrProp !=
null &&
1423 clrProp.PropertyType == typeof(
string))
1425 binding =
new Binding(
"Password")
1428 Mode = BindingMode.TwoWay,
1429 UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
1434 var dpField = type.GetField(
"PasswordProperty",
1435 System.Reflection.BindingFlags.Public |
1436 System.Reflection.BindingFlags.Static |
1437 System.Reflection.BindingFlags.FlattenHierarchy);
1439 if (dpField?.GetValue(
null) is DependencyProperty)
1441 binding =
new Binding(
"Password")
1444 Mode = BindingMode.TwoWay,
1445 UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
1487 var type = target.GetType();
1488 if (type.GetProperty(
"Password") is { } p &&
1489 p.CanRead && p.CanWrite && p.PropertyType == typeof(
string))
1492 var dpField = type.GetField(
"PasswordProperty",
1493 System.Reflection.BindingFlags.Public |
1494 System.Reflection.BindingFlags.Static |
1495 System.Reflection.BindingFlags.FlattenHierarchy);
1496 return dpField?.GetValue(
null) is DependencyProperty;
1548 try {
if (win.IsLoaded) win.Close(); }
catch { }
1582 int count = System.Windows.Media.VisualTreeHelper.GetChildrenCount(root);
1583 for (
int i = 0; i < count; i++)
1621 var list =
new List<IEnterActionProvider>();
1630 var subProviders =
GetProviders(groupControl, []) ?? [];
1631 list.AddRange(subProviders.Where(x => x.PlacementTarget != d));
1633 if (groupControl.Commit is { } commitProvider)
1635 if (subProviders.Any())
1637 commitProvider.PlacementTarget = subProviders.Last().PlacementTarget;
1640 list.Add(commitProvider);
1687 private static IEnumerable<IEnterActionProvider>
GetProviders(DependencyObject root, DependencyObject[] excepts)
1689 if (root ==
null) yield
break;
1691 var count = VisualTreeHelper.GetChildrenCount(root);
1692 for (
int i = 0; i < count; i++)
1694 var child = VisualTreeHelper.GetChild(root, i);
1697 yield
return provider;
1700 foreach (var descendant
in GetProviders(child, excepts))
1701 yield
return descendant;
1737 private static bool?
IsReadOnly(DependencyObject placementTarget)
1739 var prop = placementTarget.GetType().GetProperty(
"IsReadOnly");
1740 return (
bool?)prop?.GetValue(placementTarget);
static decimal GetMaximum(DependencyObject obj)
static bool GetUseVirtualKeyBoard(DependencyObject obj)
static readonly DependencyProperty LayoutProperty
static bool HasPasswordProperty(DependencyObject target)
static VkLayout GetLayout(DependencyObject obj)
static ? Func< DependencyObject, VkLayout > GetKeyboardLayoutAction
static void ToggleVirtualKeyBoard(DependencyObject placementTarget)
static void SetDecimalFormat(DependencyObject obj, string value)
static ? Action< DependencyObject, VkLayout, DreamineVirtualKeyboardWindow > SetBindingAction
static readonly DependencyProperty DecimalFormatProperty
static void ResetDreamineVirtualKeyboard()
static DreamineVirtualKeyboardAssist()
static void OnEnterActionProviderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
static void SetEnterActionProvider(DependencyObject obj, IEnterActionProvider value)
static readonly DependencyProperty UseVirtualKeyBoardProperty
static ? DreamineVkbIconAdorner GetDreamineVkbIconAdorner(UIElement element)
static bool EnableDreamineVirtualKeyboard
static void OnIsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
static IEnumerable< IEnterActionProvider > GetProviders(DependencyObject root, DependencyObject[] excepts)
static void ShowDreamineVirtualKeyboard(DependencyObject? placementTarget)
static void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
static readonly DependencyProperty MinimumProperty
static void SetMaximum(DependencyObject obj, decimal value)
static ? IEnterActionProvider GetEnterActionProvider(DependencyObject obj)
static void SetDreamineVkbIconAdorner(UIElement element, DreamineVkbIconAdorner value)
static readonly DependencyProperty EnterActionProviderProperty
static bool GetVkbIconVisible(DependencyObject obj)
static List< IEnterActionProvider > GetEnterActionProviders(DependencyObject d)
static readonly DependencyProperty DreamineVkbIconAdornerProperty
static bool TargetChanged(DependencyObject? placementTarget)
static void SetVkbIconVisible(DependencyObject obj, bool value)
static ? DependencyObject _placementTarget
static string GetDecimalFormat(DependencyObject obj)
static bool TryBindPasswordProperty(DependencyObject target, out Binding binding)
static void SetBinding(DependencyObject placementTarget, VkLayout layout, DreamineVirtualKeyboardWindow virtualKeyboardWindow)
static DreamineVirtualKeyboardWindow _virtualKeyboardWindow
static void SetVkbIconVisibility(DependencyObject? placementTarget, bool visible)
static readonly DependencyProperty VkbIconVisibleProperty
static void OnUseVirtualKeyBoardChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
static void OnControlMouseDown(object sender, MouseButtonEventArgs e)
static void OnVkbIconVisibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
static void SetLayout(DependencyObject obj, VkLayout value)
static void SetMinimum(DependencyObject obj, decimal value)
static void DisposeVkControl(System.Windows.DependencyObject root)
static readonly DependencyProperty MaximumProperty
static void SetUseVirtualKeyBoard(DependencyObject obj, bool value)
static ? bool IsReadOnly(DependencyObject placementTarget)
static decimal GetMinimum(DependencyObject obj)
void SetBinding(System.Windows.Data.Binding binding, decimal min=decimal.MinValue, decimal max=decimal.MaxValue, string decimalFormat="")