হ্যাঁ, আমি অতীতে এটি ActualWidth
এবং ActualHeight
বৈশিষ্ট্যগুলি দিয়ে কাজ করেছি , উভয়ই কেবল পঠনযোগ্য। আমি একটি সংযুক্ত আচরণ তৈরি করেছি যা বৈশিষ্ট্যযুক্ত ObservedWidth
এবং ObservedHeight
সংযুক্ত রয়েছে। এটিতে এমন একটি Observe
সম্পত্তিও রয়েছে যা প্রাথমিক হুক-আপ করতে ব্যবহৃত হয়। ব্যবহার এর মতো দেখাচ্ছে:
<UserControl ...
SizeObserver.Observe="True"
SizeObserver.ObservedWidth="{Binding Width, Mode=OneWayToSource}"
SizeObserver.ObservedHeight="{Binding Height, Mode=OneWayToSource}"
সুতরাং দৃশ্য মডেল আছে Width
এবং Height
বৈশিষ্ট্য সঙ্গে সবসময় সমলয়ে রয়েছে যে ObservedWidth
এবং ObservedHeight
সংযুক্ত বৈশিষ্ট্য। Observe
সম্পত্তি কেবল সংযুক্ত SizeChanged
ঘটনা FrameworkElement
। হ্যান্ডেলটিতে এটি এর ObservedWidth
এবং ObservedHeight
বৈশিষ্ট্যগুলি আপডেট করে । তদ্ব্যতীত, Width
এবং Height
দর্শন মডেলটি সর্বদা ActualWidth
এবং ActualHeight
এর সাথে সুসংগত থাকে UserControl
।
সম্ভবত নিখুঁত সমাধান নয় (আমি সম্মত হই - কেবল পঠনযোগ্য ডিপিগুলিকে বাইন্ডিংগুলি সমর্থন করা উচিতOneWayToSource
) তবে এটি কার্যকর হয় এবং এটি এমভিভিএম প্যাটার্নটিকে সমর্থন করে। স্পষ্টতই, ObservedWidth
এবং ObservedHeight
ডিপিগুলি কেবল পঠনযোগ্য নয় ।
আপডেট: এখানে কোড যা উপরে বর্ণিত কার্যকারিতা কার্যকর করে:
public static class SizeObserver
{
public static readonly DependencyProperty ObserveProperty = DependencyProperty.RegisterAttached(
"Observe",
typeof(bool),
typeof(SizeObserver),
new FrameworkPropertyMetadata(OnObserveChanged));
public static readonly DependencyProperty ObservedWidthProperty = DependencyProperty.RegisterAttached(
"ObservedWidth",
typeof(double),
typeof(SizeObserver));
public static readonly DependencyProperty ObservedHeightProperty = DependencyProperty.RegisterAttached(
"ObservedHeight",
typeof(double),
typeof(SizeObserver));
public static bool GetObserve(FrameworkElement frameworkElement)
{
frameworkElement.AssertNotNull("frameworkElement");
return (bool)frameworkElement.GetValue(ObserveProperty);
}
public static void SetObserve(FrameworkElement frameworkElement, bool observe)
{
frameworkElement.AssertNotNull("frameworkElement");
frameworkElement.SetValue(ObserveProperty, observe);
}
public static double GetObservedWidth(FrameworkElement frameworkElement)
{
frameworkElement.AssertNotNull("frameworkElement");
return (double)frameworkElement.GetValue(ObservedWidthProperty);
}
public static void SetObservedWidth(FrameworkElement frameworkElement, double observedWidth)
{
frameworkElement.AssertNotNull("frameworkElement");
frameworkElement.SetValue(ObservedWidthProperty, observedWidth);
}
public static double GetObservedHeight(FrameworkElement frameworkElement)
{
frameworkElement.AssertNotNull("frameworkElement");
return (double)frameworkElement.GetValue(ObservedHeightProperty);
}
public static void SetObservedHeight(FrameworkElement frameworkElement, double observedHeight)
{
frameworkElement.AssertNotNull("frameworkElement");
frameworkElement.SetValue(ObservedHeightProperty, observedHeight);
}
private static void OnObserveChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
var frameworkElement = (FrameworkElement)dependencyObject;
if ((bool)e.NewValue)
{
frameworkElement.SizeChanged += OnFrameworkElementSizeChanged;
UpdateObservedSizesForFrameworkElement(frameworkElement);
}
else
{
frameworkElement.SizeChanged -= OnFrameworkElementSizeChanged;
}
}
private static void OnFrameworkElementSizeChanged(object sender, SizeChangedEventArgs e)
{
UpdateObservedSizesForFrameworkElement((FrameworkElement)sender);
}
private static void UpdateObservedSizesForFrameworkElement(FrameworkElement frameworkElement)
{
// WPF 4.0 onwards
frameworkElement.SetCurrentValue(ObservedWidthProperty, frameworkElement.ActualWidth);
frameworkElement.SetCurrentValue(ObservedHeightProperty, frameworkElement.ActualHeight);
// WPF 3.5 and prior
////SetObservedWidth(frameworkElement, frameworkElement.ActualWidth);
////SetObservedHeight(frameworkElement, frameworkElement.ActualHeight);
}
}