MeasureOverride и ArrangeOverride не вызываются
Я использую ZoomControl из WPFExtensions. Исходный код здесь.
Я добавил Adorner с помощью метода OnRender:
protected override void OnRender(DrawingContext drawingContext)
{
drawingContext.DrawEllipse(
new SolidColorBrush(Colors.CornflowerBlue),
null,
new Point(1292, 100),
100, 100);
}
используя ZoomControl xaml:
<Controls:ZoomControl x:Name="zoomControl1" Background="AliceBlue">
<Canvas Width="{Binding Path=SModel.Width}" Height="{Binding Path=SModel.Height}">
<Image HorizontalAlignment="Center"
Name="image1" Stretch="Fill"
VerticalAlignment="Center" Source="/Z;component/Images/00000006.jpg"
Margin="0,0,0,0" Canvas.Left="1"
Width="{Binding Path=SModel.Width}" Height="{Binding Path=SModel.Height}">
<Image.LayoutTransform>
<RotateTransform Angle="{Binding Path=SModel.Angle}" />
</Image.LayoutTransform>
</Image>
</Canvas>
</Controls:ZoomControl>
Применяя Adorner:
public Window1()
{
InitializeComponent();
image1.Loaded += loaded;
}
private void loaded(object sender, RoutedEventArgs e)
{
var adorner = new SplitAdorner(image1);
AdornerLayer.GetAdornerLayer(image1).Add(adorner);
}
Когда я перетаскиваю Управление изображением, мой рекламодатель не двигается.
Я попытался переопределить ArrangeOverride и MeasureOverride:
protected override Size MeasureOverride(Size constraint)
{
Debug.WriteLine("measureoverride");
InvalidateVisual();
return base.MeasureOverride(constraint);
}
protected override Size ArrangeOverride(Size finalSize)
{
Debug.WriteLine("arrangeoverride");
InvalidateVisual();
return base.ArrangeOverride(finalSize);
}
Но никакого эффекта. В окне вывода ничего нет, и рекламодатель не двигается.
Когда я масштабирую - все в порядке, хотя. Adorner меняет свою позицию в соответствии с изменениями управления изображением.
Проблема в моем коде или в ZoomControl?
Пример приложения здесь.
РЕШЕНИЕ:
Мне пришлось положить свой холст в AdornerDecorator:
<Controls:ZoomControl x:Name="zoomControl1" Background="AliceBlue">
<AdornerDecorator>
<Canvas Width="{Binding Path=SModel.Width}" Height="{Binding Path=SModel.Height}">
<Image HorizontalAlignment="Center"
Name="image1" Stretch="Fill"
VerticalAlignment="Center" Source="/Z;component/Images/00000006.jpg"
Margin="0,0,0,0" Canvas.Left="1"
Width="{Binding Path=SModel.Width}" Height="{Binding Path=SModel.Height}">
<Image.LayoutTransform>
<RotateTransform Angle="{Binding Path=SModel.Angle}" />
</Image.LayoutTransform>
</Image>
</Canvas>
</AdornerDecorator>
</Controls:ZoomControl>
Описание здесь.
1 ответ
Хорошо, я посмотрел в вашем примере приложения и проверил его с помощью Snoop. Таким образом, кажется, что преобразование каким-то образом применяется и к вашему рекламодателю, но визуально не обновляется правильно. Панорамирование работает на самом деле, просто ваш рекламодатель не признан недействительным. Одна из самых быстрых идей - предоставить свой объект зависимости зависимостей для масштабирования, перевести x, перевести y, установить флаг свойства "AffectsRender" и связать их из элемента управления масштабированием с вашим холстом. Теперь каждый раз, когда элемент управления масштабированием изменяет одно из этих свойств, свойства украшателей обновляются с помощью привязки и становятся недействительными напрямую с помощью флага "AffectsRender".
[Первый ответ, но не действительный]
Применяете ли вы преобразование масштабирования к вашему рекламодателю? Поскольку рекламный элемент не размещен на элементе управления, фактически он зарегистрирован в следующем AdornerDecorator, который находится вверху, начиная с предоставленного элемента управления. Я предполагаю, что единственный найденный декоратор (или слой) является окном по умолчанию. Примените преобразование элемента управления к вашему рекламодателю, и оно должно работать. Или вы можете разместить AdornerDecorator внутри вашего Zoomcontrol, но если честно, я не уверен, что это даст желаемый эффект.