using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; namespace AIStudio.Wpf.DiagramDesigner { public static class WidthAndHeightProps { public static readonly DependencyProperty ActiveProperty = DependencyProperty.RegisterAttached( "Active", typeof(bool), typeof(WidthAndHeightProps), new FrameworkPropertyMetadata(OnActiveChanged)); public static bool GetActive(FrameworkElement frameworkElement) { return (bool)frameworkElement.GetValue(ActiveProperty); } public static void SetActive(FrameworkElement frameworkElement, bool active) { frameworkElement.SetValue(ActiveProperty, active); } public static readonly DependencyProperty BoundActualWidthProperty = DependencyProperty.RegisterAttached( "BoundActualWidth", typeof(double), typeof(WidthAndHeightProps)); public static double GetBoundActualWidth(FrameworkElement frameworkElement) { return (double)frameworkElement.GetValue(BoundActualWidthProperty); } public static void SetBoundActualWidth(FrameworkElement frameworkElement, double width) { frameworkElement.SetValue(BoundActualWidthProperty, width); } public static readonly DependencyProperty BoundActualHeightProperty = DependencyProperty.RegisterAttached( "BoundActualHeight", typeof(double), typeof(WidthAndHeightProps)); public static double GetBoundActualHeight(FrameworkElement frameworkElement) { return (double)frameworkElement.GetValue(BoundActualHeightProperty); } public static void SetBoundActualHeight(FrameworkElement frameworkElement, double height) { frameworkElement.SetValue(BoundActualHeightProperty, height); } private static void OnActiveChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) { if (!(dependencyObject is FrameworkElement frameworkElement)) { return; } if ((bool)e.NewValue) { frameworkElement.SizeChanged -= OnFrameworkElementSizeChanged; frameworkElement.SizeChanged += OnFrameworkElementSizeChanged; frameworkElement.Loaded -= FrameworkElement_Loaded; frameworkElement.Loaded += FrameworkElement_Loaded; } else { frameworkElement.SizeChanged -= OnFrameworkElementSizeChanged; frameworkElement.Loaded -= FrameworkElement_Loaded; } } private static void FrameworkElement_Loaded(object sender, RoutedEventArgs e) { UpdateObservedSizesForFrameworkElement(sender as FrameworkElement); } private static void OnFrameworkElementSizeChanged(object sender, SizeChangedEventArgs e) { if (sender is FrameworkElement frameworkElement) { UpdateObservedSizesForFrameworkElement(frameworkElement); } } private static void UpdateObservedSizesForFrameworkElement(FrameworkElement frameworkElement) { frameworkElement.SetCurrentValue(BoundActualWidthProperty, frameworkElement.ActualWidth); frameworkElement.SetCurrentValue(BoundActualHeightProperty, frameworkElement.ActualHeight); } } }