У меня есть следующий элемент управления:
<UserControl x:Class="FooBar.AnnotationControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="400" Width="500" > <ScrollViewer Height="400" Width="500"> <Canvas Height="400" Width="500" Name="ctlCanvas" MouseLeftButtonDown="MouseLeftButtonDownHandler" MouseWheel="Canvas_MouseWheel" > <Canvas.RenderTransform> <ScaleTransform x:Name="ZoomTransform" /> </Canvas.RenderTransform> </Canvas> </ScrollViewer> </UserControl> namespace FooBar { public partial class AnnotationControl : UserControl { public AnnotationControl() { InitializeComponent(); } private void MouseLeftButtonDownHandler( object sender, MouseButtonEventArgs args) { //Do Something } private void Canvas_MouseWheel(object sender, MouseWheelEventArgs e) { ctlCanvas.Measure(new Size(ctlCanvas.ActualWidth * ZoomTransform.ScaleX, ctlCanvas.ActualHeight * ZoomTransform.ScaleY)); } } }
Я пытаюсь заставить зрителя прокрутки реагировать на масштабирование холста. Вызов Canvas.Measure не изменяет желаемый размер холста. Есть идеи, что здесь происходит?
Вы НЕ должны вызывать Measure самостоятельно.Этот метод должен вызываться на шаге макета, а не где-то еще.Также RenderTransform не меняет ваш размер.RenderTransform применяется ПОСЛЕ фактического размещения макета.Таким образом, у вас есть средство прокрутки, которому не нужно прокручивать содержимое, потому что оно того же размераЧто вам может понадобиться, это LayoutTransform.
Хорошо, похоже, я нашел решение.Похоже, я могу обернуть свой холст другим холстом, и когда я масштабирую его, я просто устанавливаю высоту и ширину для внешнего холста = начальная высота и ширина, умноженные на текущие масштабы X и Y ScaleTransform.
Canvas - самый примитивный элемент, и он просто не предназначен для работы с ScrollViewer. Вместо этого используйте Grid / StackPanel / WarPanel / UniformGrid.