WPF画布所需大小

WPF画布所需大小,wpf,scrollviewer,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

我有以下控制权:

<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));
        }
    }

}

名称空间FooBar
{
公共分部类AnnotationControl:UserControl
{
公共注释控件()
{
初始化组件();
}
私有void MouseLeftButtonDownHandler(对象发送方,MouseButtonEventArgs参数)
{
//做点什么
}
私有void Canvas_MouseWheel(对象发送方,MouseWheelEventArgs e)
{
ctlnavas.Measure(新大小(ctlnavas.ActualWidth*ZoomTransform.ScaleX、ctlnavas.ActualHeight*ZoomTransform.ScaleY));
}
}
}

我试图让滚动查看器响应画布的缩放。调用Canvas.Measure似乎不会更改画布的所需大小。你知道这是怎么回事吗?

画布是最原始的元素,它根本不适合ScrollViewer。改用Grid/StackPanel/WarPanel/UniformGrid。

您不应该自己调用Measure。该方法应该在布局步骤中调用,而不是在其他地方调用。另外,RenderTransform不会更改您的大小。在实际布局完成后应用RenderTransform。所以你有一个scrollviewer,它不需要滚动它的内容,因为它的大小是一样的。您可能需要的是布局转换。

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

实际上这不是真的。当然,它可以与Canvas一起工作,但不是像某些人预期的那样开箱即用。如果画布的大小大于scrollviewer,则scrollviewer将完美地滚动画布。画布应用于任何布局元素。相信我的话。好吧,我用它来“画”箭头、椭圆、直线等,并放大/缩小。我还可以用Grid/StackPanel/WarPanel/UniformGridDmitry做所有这些吗?我们用它做了很多布局,它工作得很好,为什么不呢?这是一个简单的小组,我同意,但它仍然是一个小组。只要它将正确的大小返回给其父级scrollviewer,scrollviewer就不关心它滚动的是哪个子级。我们还使用画布绘制和显示巨大的流程图,因此您也可以相信我的话;)那么,你如何强迫它返回一个准确的期望尺寸呢?我已经读过关于子类化Canvas和重写处理这个问题的方法的内容。这种方法的问题是,这也是silverlight控件,SL4没有在子类中正确连接事件处理程序。我想我可以解决这个问题,但是…这不像ScaleTransform那样以鼠标为中心,它也不适用于Silverlight。这是另一个问题。但您是对的,LayoutTransform用于在布局之前进行转换,RenderTransform用于在布局之后进行转换。但是在布局之后,Scrollviewer不知道您要缩放多少。你想要实现的是更复杂一点,我对我们的图表控件做了同样的事情,我使用了RenderTransform,其余的都是手工完成的。请修改你最近两个问题的标题,标题应该是1。不包含标签(如WPF)和2。描述问题/提出适当的问题。