WPF Canvas所需尺寸

时间:2011-12-16 16:55:28

标签: wpf scrollviewer

我有以下控件:

<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大小。知道这里发生了什么吗?

3 个答案:

答案 0 :(得分:1)

你不应该自己打电话给Measure。应该在布局步骤中调用此方法,而不是在其他位置调用。此外,RenderTransform不会更改您的尺寸。在实际布局完成后应用RenderTransform。所以你有一个不需要滚动其内容的scrollviewer,因为它的大小相同。你可能想要的是LayoutTransform。

答案 1 :(得分:0)

Canvas是最原始的元素,它根本不适合与ScrollViewer一起使用。改为使用Grid / StackPanel / WarPanel / UniformGrid。

答案 2 :(得分:0)

好的,我似乎找到了解决方案。看起来我可以用另一个画布包裹我的画布,当我缩放它时,我只需设置外部画布的高度和宽度=初始高度和宽度乘以ScaleTransform的当前X和Y标度。