2010-09-21 4 views
0

Ok,Удаление визуализация преобразования дочернего элемента

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

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

Итак, я попытался использовать прикрепленное свойство, похожее на это пиксельное привязку (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); 
    } 

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

Любая помощь приветствуется! :)

Спасибо!

Andy.

ответ

0

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

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

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

Поведение пиксельных привязок должно работать на ViewBox.

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

+0

Ничего себе, все забыл о ViewBox! Его всегда простые решения, которые пропускаются! В любом случае, я устранил необходимость размахивания, поэтому я решил это так! Быстрее, чем я изобразил! :) По-прежнему интересно узнать больше о том, как преобразования распространяются на детей, просто из интереса, если у вас есть какие-либо знания/ссылки? – Andy

+0

@ Andy: В отличие от реального 3D-рендеринга, он эффективно работает снизу вверх. Представьте, что каждый элемент управления дочерним элементом является просто растровым. Затем он имеет следующее преобразование, применяемое к нему родителем.Прополощите и повторите, пока не нажмете верхнюю часть дерева рендеринга :) –