删除子元素的渲染变换

时间:2010-09-21 10:36:16

标签: silverlight attached-properties rendertransform

确定,

所以我有一种情况,即边界正在缩放(有时是大量的)并翻译。在边框内部是一个网格,网格内部是两个图像,一个是照片,被拉伸到边框的大小,另一个,我打算成为一个图标,底部需要一个固定的大小左手角落。

问题是,我想删除缩放对图标的影响。这是因为我给了图标一个固定的大小,并希望它保持这个大小,但不幸的是,边界的缩放正沿着边界的子项传播并影响它们。

所以我尝试使用附加属性,类似于这个像素对齐艺术(http://blogs.msdn.com/b/devdave/archive/2008/06/22/using-an-attached-dependencyproperty-to-implement-pixel-snapping-as-an-attached-behavior.aspx),但它似乎没有什么区别。在通过时,在我设置它之前,在LayoutUpdate中修改的元素总是似乎总是具有渲染变换的单位矩阵。

我想我错过了 - 如何将渲染变换应用于儿童?

无论如何,这就是我所拥有的(另外,我知道这个(如果有效)也会删除翻译,这不是我想要的!):

    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);
    }

我想我可能会以完全错误的方式考虑这个问题。我想合理的解决方案是重构以消除缩放的需要,但我想我只是在我可以使用的更快的解决方案之后,直到我有时间。

任何帮助表示赞赏! :)

谢谢!

安迪。

1 个答案:

答案 0 :(得分:0)

如果您只是缩放(我假设固定宽高比)似乎过于复杂,为什么不将照片放在ViewBox容器中?将ViewBox(包含照片)和图标(按此顺序)放在父网格中。

  • 使图标相对于底部 左边使用对齐和边距 设置
  • 调整视图框大小以缩放图像。

网格将缩小以适合视图框大小。该图标将保持相对于左下角的网格。

您的像素对齐行为应该适用于ViewBox。

如果你需要一个具体的例子,请提供一些你的Xaml来工作