2012-01-03 7 views
0

Я использую ZoomControl от WPFExtensions. Исходный код: here.MeasureOverride и ArrangeOverride не называются

Я добавил 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); 
} 

Когда я тащу контроль изображения, мой 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 не движется.

Когда я увеличиваю масштаб - все в порядке. Adorner изменяет свою позицию в соответствии с изменениями Image control.

Проблема в моем коде или в ZoomControl?

Пример приложения here.

РЕШЕНИЕ:

я должен был поставить мой холст в 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> 

описание here.

ответ

1

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

[Первый ответ, но не действует]

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

+0

Но как насчет масштабирования? Когда я увеличиваю изображение, adorner меняется автоматически. Поэтому трансформация применяется как-то. – ieaglle

+0

Да, это меня озадачивает. Он должен масштабироваться и панорамироваться каким-либо образом, за исключением того, что вы каким-либо образом изменяете отображаемый контент, я проверю ваш код. А пока вы попробовали мой совет? – dowhilefor

+0

Выполняется ...:) – ieaglle