2010-09-21 90 views
0

好的,刪除子元素的渲染變換

所以我有一種情況,邊界被縮放(有時是大量)並翻譯。在邊框內部是一個網格,網格內部是兩個圖像,一個是照片,並且被拉伸到邊框的大小,另一個,我打算成爲一個圖標,它的底部需要是一個固定的大小左手邊角落。

問題是,我想刪除縮放對圖標的影響。這是因爲我給這個圖標設置了一個固定的大小,並希望它保持這個大小,但不幸的是,邊界的縮放會沿着邊界的孩子傳播並影響他們。

所以我使用附加屬性,與此類似像素貼緊ARTICAL(http://blogs.msdn.com/b/devdave/archive/2008/06/22/using-an-attached-dependencyproperty-to-implement-pixel-snapping-as-an-attached-behavior.aspx)試過了,但它似乎不有所作爲。當我設置它之前,在LayoutUpdate中被修改的元素總是似乎具有用於渲染變換的單位矩陣。

我猜我誤interperating如何渲染變換應用於兒童可能?

無論如何,這是我有什麼(另外,我知道這(如果它的工作)將消除翻譯過,這不是我想要的!):

public static readonly DependencyProperty IsConstantSizeProperty = 
     DependencyProperty.RegisterAttached(
     "ConstantWidth", 
     typeof(bool), 
     typeof(ItemsControlEX), 
     new PropertyMetadata(new PropertyChangedCallback(IsConstantSizeChanged))); 

    private static List<FrameworkElement> m_constSizeObjects = new List<FrameworkElement>(); 

    private static void IsConstantSizeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
    { 
     bool isConstantWidth = (bool)args.NewValue; 
     if (isConstantWidth) 
     { 
      FrameworkElement el = (FrameworkElement)obj; 
      m_constSizeObjects.Add(el); 

      el.LayoutUpdated += new EventHandler(el_LayoutUpdated); 
      el.Unloaded += new RoutedEventHandler(el_Unloaded); 
     } 
    } 

    static void el_Unloaded(object sender, RoutedEventArgs e) 
    { 
     FrameworkElement el = (FrameworkElement)sender; 
     el.Unloaded -= new RoutedEventHandler(el_Unloaded); 
     el.LayoutUpdated -= new EventHandler(el_LayoutUpdated); 

     m_constSizeObjects.Remove(el); 
    } 

    static void el_LayoutUpdated(object sender, EventArgs e) 
    { 
     foreach (FrameworkElement el in m_constSizeObjects) 
     { 
      MatrixTransform trans = new MatrixTransform(); 
      trans.Matrix = Matrix.Identity; 
      el.RenderTransform = trans; 
     } 
    } 

    public static void SetIsConstantWidth(UIElement element, Boolean value) 
    { 
     element.SetValue(IsConstantSizeProperty, value); 
    } 

    public static Boolean GetIsConstantWidth(UIElement element) 
    { 
     return (Boolean)element.GetValue(IsConstantSizeProperty); 
    } 

我想我」我可能會用完全錯誤的方式來思考這個問題。我想合理的解決方案是重構以消除縮放的需求,但我想我只是在我有時間之前可以使用更快的解決方案之後。

任何幫助表示讚賞! :)

謝謝!

Andy。

回答

0

如果你只縮放(我假設固定縱橫比),這似乎過於複雜,爲什麼不放在一個容器視框的照片?將ViewBox(包含照片)和圖標(按照該順序)放在父網格中。

  • 請使用對齊和邊距 設置
  • 調整視框縮放圖像相對於底部 圖標左邊。

該網格將縮小以適合視框的大小。該圖標將保持相對於網格左下角的位置。

你的像素捕捉行爲應該在ViewBox上工作。

如果您需要一個具體示例,請提供一些Xaml,以便從開始工作。

+0

哇,忘了所有關於ViewBox!它始終是被忽視的簡單解決方案!無論哪種方式,我已經刪除了需要削減,所以我已經解決了這種方式!比我想象的快! :) 如果您有任何知識/鏈接,您是否仍然有興趣更深入地瞭解如何將轉化傳播給兒童,只是出於興趣? – Andy 2010-09-21 11:34:51

+0

@安迪:與真實的3D渲染不同,它有效地從下到上工作。試想每個孩子的控制只是一個位圖。然後由父級應用下一個變換。沖洗並重復,直到你到達渲染樹的頂部:) – 2010-09-21 11:37:44