2010-09-21 85 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