Контролировать размер холста в ScrollViewer - PullRequest
0 голосов
/ 02 апреля 2020

Я пишу пользовательский элемент управления для отображения изображений и взаимодействия. Некоторые из необходимых ему функций - это масштабирование и панорамирование, а также рисование интересующей области, то есть рисование прямоугольника поверх отображаемого фрейма с произвольным положением и размером. Функции масштабирования и панорамирования сделаны и работают хорошо, я использую ScrollViewer, преобразование масштаба и некоторые обработчики событий для щелчка и перемещения мыши в коде C#.

Для функции пользовательского выбора я хочу добавьте холст поверх рамки, так как это единственный известный мне способ, позволяющий произвольно позиционировать прямоугольник. Чтобы любые формы на холсте могли быть сопоставлены с координатами изображения, мне, конечно, нужно, чтобы холст точно совпал с изображением, поэтому размер и положение должны быть одинаковыми. Я также хотел бы, чтобы изображение продолжало приспосабливаться к изменениям размера окна, как это происходит без какого-либо холста. Так как Canvas не изменяет размеры себя автоматически, я хочу привязать его размеры к размеру изображения следующим образом (это из шаблона элемента управления для пользовательского элемента управления):

<ScrollViewer x:Name="scrollViewer" Grid.Column="0" Grid.Row="1" CanContentScroll="True" PanningMode="Both" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible">
  <Grid>
    <Image x:Name="screen" Panel.ZIndex="0" Cursor="Cross" Source="{TemplateBinding ColoredFrame}"/
    <Canvas x:Name="testCanvas" Panel.ZIndex="1" Background="Transparent" Width="{Binding ActualWidth, ElementName=screen}" Height="{Binding ActualHeight, ElementName=screen}"/>
    <Grid.LayoutTransform>
      <TransformGroup>
        <RotateTransform Angle="{Binding RotationAngle, RelativeSource={RelativeSource TemplatedParent}}"/>
        <ScaleTransform x:Name="scaleTransform" ScaleX="{Binding ZoomFactor, RelativeSource {RelativeSource TemplatedParent}}" ScaleY="{Binding ZoomFactor, RelativeSource={RelativeSource TemplatedParent}}"/>
      </TransformGroup>
    </Grid.LayoutTransform>
  </Grid>
</ScrollViewer>

Однако я получая странное поведение с этим - когда я использую привязки для ширины и высоты холста к ActualWidth и ActualHeight изображения, как в приведенном выше коде, он автоматически изменит свой размер только при увеличении размера (когда пользователь увеличивает размер окна), но не тогда, когда оно уменьшается. Любое увеличение размера является постоянным, и при уменьшении окна снова придется прокручивать, поскольку размер изображения и холста никогда не уменьшаются. Этого не происходит, когда я связываю только одно из измерений (ширину или высоту) и задаю для другого постоянное значение. Режимы привязки (односторонний / двусторонний) также не имеют никакого эффекта.

Возможно, я упускаю что-то действительно очевидное, но я потратил часы, пытаясь понять это, и я в растерянности. Любая помощь будет оценена.

1 Ответ

1 голос
/ 02 апреля 2020

Насколько я знаю, Canvas не имеет хороших параметров размеров. Я думаю Adorner сделает то, что вы пытаетесь достичь. Для примера и дополнительной информации, пожалуйста, посмотрите здесь: https://docs.microsoft.com/de-de/dotnet/framework/wpf/controls/adorners-overview

Счастливое кодирование Тим

...