MeasureOverride и ArrangeOverride не вызываются - PullRequest
0 голосов
/ 03 января 2012

Я использую ZoomControl из WPFExtensions . Исходный код здесь .

Я добавил автора с помощью метода 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>

Заявка на участие:

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 Ответ

1 голос
/ 03 января 2012

Хорошо, я посмотрел ваше приложение-пример и проверил его с помощью snoop.Таким образом, кажется, что преобразование каким-то образом применяется и к вашему рекламодателю, но визуальное обновление не корректно обновляется.Панорамирование работает на самом деле, просто ваш рекламодатель не признан недействительным.Одна быстрая идея состоит в том, чтобы дать вашему зависимому свойству свойства зависимости для масштабирования, перевести x, перевести y, установить флаг свойства «AffectsRender» и связать их из элемента управления масштабированием с вашим холстом.Теперь каждый раз, когда ваш элемент управления масштабированием изменяет одно из этих свойств, свойства украшателей обновляются с помощью привязки и становятся недействительными с помощью флага «AffectsRender».

[Первый ответ, но не действительный]

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

...