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.
Ничего себе, все забыл о ViewBox! Его всегда простые решения, которые пропускаются! В любом случае, я устранил необходимость размахивания, поэтому я решил это так! Быстрее, чем я изобразил! :) По-прежнему интересно узнать больше о том, как преобразования распространяются на детей, просто из интереса, если у вас есть какие-либо знания/ссылки? – Andy
@ Andy: В отличие от реального 3D-рендеринга, он эффективно работает снизу вверх. Представьте, что каждый элемент управления дочерним элементом является просто растровым. Затем он имеет следующее преобразование, применяемое к нему родителем.Прополощите и повторите, пока не нажмете верхнюю часть дерева рендеринга :) –