2010-07-23 28 views
0

我有一個類 public class NavigableViewport3D : Viewport3D。該類應該隱藏Viewport3D.Camera屬性,以使其變爲只讀。這是我到目前爲止有:WPF:如何使基類的依賴項屬性爲只讀


public class NavigableViewport3D : Viewport3D 
{ 
    protected static readonly DependencyPropertyKey CameraPropertyKey = DependencyProperty.RegisterReadOnly(
     "Camera", 
     typeof(Camera), 
     typeof(NavigableViewport3D), 
     new PropertyMetadata() 
     ); 
    public static readonly new DependencyProperty CameraProperty = CameraPropertyKey.DependencyProperty; 

    public new Camera Camera 
    { 
     get 
     { 
      return base.Camera; 
     } 
     protected set 
     { 
      base.Camera = value; 
     } 
    } 
} 

但我也希望NavigableViewport3D.CameraProperty到送花兒給人返回相同的值作爲Viewport3D.CameraProperty/base.Camera ... 如果沒有依賴屬性,我會做這樣的:

 
public class NavigableViewport3D : Viewport3D 
{ 
    public new Camera Camera 
    { 
     get 
     { 
      return base.Camera; 
     } 
     protected set 
     { 
      base.Camera = value; 
     } 
    }
}
這裏是要做到雙向交流的醜陋的方式:


public class NavigableViewport3D : Viewport3D 
{ 
    protected static readonly DependencyPropertyKey CameraPropertyKey = DependencyProperty.RegisterReadOnly(
     "Camera", 
     typeof(Camera), 
     typeof(NavigableViewport3D), 
     new PropertyMetadata(new PropertyChangedCallback(
      delegate(DependencyObject depO, DependencyPropertyChangedEventArgs e) 
      { 
       if (e.OldValue != e.NewValue) //Not sure whether this is needed 
        depO.SetValue(Viewport3D.CameraProperty, e.NewValue); 
      } 
     ))); 
    public static readonly new DependencyProperty CameraProperty = CameraPropertyKey.DependencyProperty; 

    public new Camera Camera 
    { 
     get 
     { 
      return this.Camera; 
     } 
     protected set 
     { 
      this.Camera = value; 
     } 
    }   

    public NavigableViewport3D() 
    { 
     Viewport3D.CameraProperty.AddOwner(
      typeof(NavigableViewport3D), 
      new PropertyMetadata(new PropertyChangedCallback(
       delegate(DependencyObject depO, DependencyPropertyChangedEventArgs e) 
       { 
        var nv3d = depO as NavigableViewport3D; 
        if (nv3d == null) 
         return; 
        nv3d.SetValue(CameraPropertyKey, e.NewValue); 
       } 
     ))); 
    } 
} 

我認真地希望有更好的方式來做到這一點...有什麼建議?

回答

0

如何:

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 
    } 

    public class NavigableViewport3D : Viewport3D 
    { 
     public static readonly new DependencyProperty CameraProperty; 

     static NavigableViewport3D() 
     { 
      NavigableViewport3D.CameraProperty = Viewport3D.CameraProperty.AddOwner(typeof(NavigableViewport3D)); 
     } 
    } 
} 
+0

感謝,但我想,以使新屬性只讀... – meanandvicious 2010-07-26 09:28:34

+0

也許這MSDN文章將幫助: http://msdn.microsoft.com/en -us /庫/ ms754044.aspx – 2010-07-26 13:37:02