Я пишу пользовательский элемент управления для отображения изображений и взаимодействия. Некоторые из необходимых ему функций - это масштабирование и панорамирование, а также рисование интересующей области, то есть рисование прямоугольника поверх отображаемого фрейма с произвольным положением и размером. Функции масштабирования и панорамирования сделаны и работают хорошо, я использую 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 изображения, как в приведенном выше коде, он автоматически изменит свой размер только при увеличении размера (когда пользователь увеличивает размер окна), но не тогда, когда оно уменьшается. Любое увеличение размера является постоянным, и при уменьшении окна снова придется прокручивать, поскольку размер изображения и холста никогда не уменьшаются. Этого не происходит, когда я связываю только одно из измерений (ширину или высоту) и задаю для другого постоянное значение. Режимы привязки (односторонний / двусторонний) также не имеют никакого эффекта.
Возможно, я упускаю что-то действительно очевидное, но я потратил часы, пытаясь понять это, и я в растерянности. Любая помощь будет оценена.