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。描述问题/提出适当的问题。