我希望我Canvas自动调整大小到其项目的大小,以便ScrollViewer滚动条具有正确的范围.这可以在XAML中完成吗?
<ScrollViewer HorizontalScrollBarVisibility="Auto" x:Name="_scrollViewer">
<Grid x:Name ="_canvasGrid" Background="Yellow">
<Canvas x:Name="_canvas" HorizontalAlignment="Left" VerticalAlignment="Top" Background="Green"></Canvas>
<Line IsHitTestVisible="False" .../>
</Grid>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,画布的大小始终为0,但它不会剪切其子元素.
我创建了一个继承自WPF的自定义画布控件Canvas.我在主窗口中使用它 -
<ScrollViewer
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<RTD:RTDesignerCanvas
Margin="5"
Background="White"
x:Name="canvas1"
Focusable="True"
AllowDrop="True">
</RTD:RTDesignerCanvas>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
一切正常,但是当我尝试像这样设置控件的位置时
Canvas.SetTop(item, 200);
滚动条不可见,控件隐藏在某处.有趣的是,如果我向其添加另一个控件滚动条是可见的,我可以向下滚动以查看上一个控件.
我试着用
base.InvalidateVisual();
base.UpdateLayout();
base.InvalidateArrange();
Run Code Online (Sandbox Code Playgroud)
更换物品后Top或Left没有任何反应; 我错过了什么或者由于某些错误而发生这种情况?
更新:
澄清,说我有有它的画布width,height100,100.现在,如果我用移动的控制(在画布上已添加),Canvas.SetLeft(myControl, 200)然后它会移动到这是默认情况下不可见,并且滚动条也被禁止的位置,所以没有办法看到那种控制.
现在,如果我向Canvas添加另一个控件,ScrollBars会正确显示,我可以通过滚动查看上一个控件.
为什么这在wpf中运行良好
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Canvas x:Name="MyDesigner">
</Canvas>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
现在,当我在Silverlight中执行相同操作并加载"可以拖动"的控件时,滚动条不会被触发,当我拖出视图时,没有任何反应...但是在wpf中它会自动显示它们...