2016-07-11 30 views
0

Ich möchte einige Line-Drawing-Operationen von meinem ViewModel (d. H. Ich werde zu einer Sammlung von Linien hinzufügen, die an eine ItemsControl meiner Ansicht gebunden sind).Wie lese ich die Höhe und Breite eines Bildes aus meinem Ansichtsmodell?

Dazu muss ich aus meiner Sicht die Höhe und Breite eines Image wissen. Wie bekomme ich sie?

Es gibt einige Problemumgehungen, die in einigen anderen SO-Posts erwähnt werden, aber they are for WPF und keine von ihnen funktionieren mit Metro.

+0

die SO-Post, die Sie erwähnten, funktioniert in WinRT! –

+1

@ChiragShah Ich habe versucht, den Code in dieser Antwort erwähnt, aber es hat eine Menge von nicht identifizierten Referenzen. Es gibt zum Beispiel kein 'frameworkElement.SetCurrentValue'. Könnten Sie eine Antwort posten, die in winRT funktioniert? –

Antwort

1
public static class SizeObserver 
{ 
    public static readonly DependencyProperty ObserveProperty = DependencyProperty.RegisterAttached(
     "Observe", 
     typeof(bool), 
     typeof(SizeObserver), new PropertyMetadata(null, OnObserveChanged)); 
    //new FrameworkPropertyMetadata(OnObserveChanged)); 

    public static readonly DependencyProperty ObservedWidthProperty = DependencyProperty.RegisterAttached(
     "ObservedWidth", 
     typeof(double), 
     typeof(SizeObserver), null); 

    public static readonly DependencyProperty ObservedHeightProperty = DependencyProperty.RegisterAttached(
     "ObservedHeight", 
     typeof(double), 
     typeof(SizeObserver), null); 




    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.SetValue(ObservedWidthProperty, frameworkElement.ActualWidth); 
     frameworkElement.SetValue(ObservedHeightProperty, frameworkElement.ActualHeight); 

     // WPF 3.5 and prior 
     ////SetObservedWidth(frameworkElement, frameworkElement.ActualWidth); 
     ////SetObservedHeight(frameworkElement, frameworkElement.ActualHeight); 
    } 
} 
+0

Habe nicht bemerkt, dass die erforderlichen Änderungen minimal waren! Das funktioniert gut, danke :) –