Удаление преобразования визуализации дочернего элемента - PullRequest
0 голосов
/ 21 сентября 2010

Хорошо,

Итак, у меня есть ситуация, когда граница масштабируется (иногда в большом количестве) и переводится. Внутри рамки находится сетка, а внутри сетки находятся два изображения, одно из которых является фотографией и растянуто до размера границы, а другое я намереваюсь сделать иконкой, которая должна быть фиксированного размера в нижней части. левый угол.

Проблема в том, что я хочу убрать эффект масштабирования на значке. Это потому, что я присвоил значку фиксированный размер и хотел бы, чтобы он оставался таким же, но, к сожалению, масштабирование от границы распространяется вниз по дочерним элементам границы и также влияет на них.

Итак, я попытался использовать присоединенное свойство, похожее на художественную привязку к пикселям (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 голосов
/ 21 сентября 2010

Если вы только масштабируете (я предполагаю фиксированное соотношение сторон), которое кажется слишком сложным, почему бы не поместить фотографию в контейнер ViewBox?Поместите ViewBox (содержащий фотографию) и значок (в указанном порядке) в родительскую сетку.

  • Создайте значок относительно левого нижнего края, используя настройки выравнивания и полей
  • Изменить размерокно просмотра для масштабирования изображения.

Сетка будет уменьшена до размера окна просмотра.Значок останется относительно сетки слева внизу.

Ваше поведение привязки к пикселям должно работать в ViewBox.

Если вам нужен конкретный пример, предоставьте некоторые из своих Xamlработать с .

...