Удаление преобразования визуализации дочернего элемента
В порядке,
Таким образом, у меня есть ситуация, когда граница масштабируется (иногда в большом количестве) и переводится. Внутри рамки находится сетка, а внутри сетки находятся два изображения, одно из которых является фотографией и растянуто до размера границы, а другое я намереваюсь сделать иконкой, которая должна быть фиксированного размера в нижней части. левый угол.
Проблема в том, что я хочу убрать эффект масштабирования на значке. Это потому, что я присвоил значку фиксированный размер и хотел бы, чтобы он оставался таким же, но, к сожалению, масштабирование от границы распространяется вниз по дочерним элементам границы и также влияет на них.
Поэтому я попытался использовать прикрепленное свойство, похожее на художественный щелчок с этим пикселем ( 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 ответ
Если вы только масштабируете (я предполагаю фиксированное соотношение сторон), которое кажется слишком сложным, почему бы не поместить фотографию в контейнер ViewBox? Поместите ViewBox (содержащий фотографию) и значок (в указанном порядке) в родительскую сетку.
- Сделайте значок относительно левого нижнего края, используя настройки выравнивания и полей
- Измените размер окна просмотра, чтобы масштабировать ваше изображение.
Сетка будет уменьшаться, чтобы соответствовать размеру окна просмотра. Значок останется относительно сетки внизу слева.
Ваше поведение привязки к пикселям должно работать в ViewBox.
Если вам нужен конкретный пример, предоставьте свой Xaml для работы.