我有以下控件:
<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的缩放。对Canvas.Measure的调用似乎不会改变Canvas的Desired大小。知道这里发生了什么吗?
答案 0 :(得分:1)
你不应该自己打电话给Measure。应该在布局步骤中调用此方法,而不是在其他位置调用。此外,RenderTransform不会更改您的尺寸。在实际布局完成后应用RenderTransform。所以你有一个不需要滚动其内容的scrollviewer,因为它的大小相同。你可能想要的是LayoutTransform。
答案 1 :(得分:0)
Canvas是最原始的元素,它根本不适合与ScrollViewer一起使用。改为使用Grid / StackPanel / WarPanel / UniformGrid。
答案 2 :(得分:0)
好的,我似乎找到了解决方案。看起来我可以用另一个画布包裹我的画布,当我缩放它时,我只需设置外部画布的高度和宽度=初始高度和宽度乘以ScaleTransform的当前X和Y标度。