2014-01-17 36 views
1

enter image description here帆布不当内部的DockPanel中

覆盖一个TextBlock成分在图像这里,随着它的数的每个块表示一个激光器。这些块放置在DockPanel内的画布上。 DockPanel里面停靠的顶部是红色的TextBlock,你可以看到隐藏在激光地图画布后面。这是为什么发生? TextBlock停靠在DockPanel的顶部,画布没有停靠位置,因此它应该填充剩余空间。另外值得注意的是:为了让整个中心屏幕空间能够在窗口大小上正确缩放,我必须将DockPanel放在ViewBox中。然后,我必须将该ViewBox放入ScrollViewer中,以便在需要时显示滚动条。

这里是中心屏幕的XAML代码(注意:窗口的孩子是一个DockPanel。菜单停靠在顶部,左侧按钮面板停靠在左侧,右侧面板停靠在右边,状态栏停靠在底部和一切你在屏幕中央看到的是由下面的XAML代码中定义)

<ScrollViewer 
     Name="centerScreenScrollViewer" 
     VerticalScrollBarVisibility="Auto" 
     HorizontalScrollBarVisibility="{Binding IsScrollbarsVisible, Converter={StaticResource BoolToScrollbarVisConverter}, FallbackValue=Hidden}"> 
     <Viewbox> 
      <DockPanel 
       LastChildFill="True"> 
       <TextBlock 
        DockPanel.Dock="Top" 
        Name="tbkFullVisual" 
        Style="{StaticResource tbkStyleBlue}" 
        Foreground="Red" 
        IsEnabled="{Binding FullVisual}" 
        HorizontalAlignment="Center" 
        VerticalAlignment="Top" 
        FontSize="24"> 
        *** This Print Requires Full Visual Inspection! *** 
       </TextBlock> 
       <Canvas x:Name="mapCanvas"> 
        <ContentPresenter Content="{Binding MapCanvas}"/> 
       </Canvas> 
      </DockPanel> 
     </Viewbox> 
    </ScrollViewer> 

解决这个问题的任何帮助,将不胜感激。

问候,

凯尔

回答

2

这与顺便做一个ViewBox的作品,特别是与Canvas元素。 ViewBox用于调整子元素的大小,因为我相信你知道。有2个问题与Canvas元素:

  1. 默认HeightWidth是0,这意味着TextBlock将得到所有的空间。
  2. Canvas元素可让您在自己的边界之外绘制,因此即使您的画布很小或甚至不可见,也可以渲染您的数字网格。

最快的解决办法是设置VerticalAlignmentViewBox

<Viewbox VerticalAlignment="Top"> 
    ... 
</Viewbox> 

您可以设置在画布上一个Height,但我认为这是不太理想的,因为你不希望动态改变该与窗口调整大小。

+0

这效果很好。谢谢,我会接受这个答案。但首先,另一个快速问题是:我怎样才能做到这一点,所以帆布的孩子不会超出界限?我已经使用了ClipToBounds = True,但是由于我没有为画布定义大小,因此这会导致问题。有什么建议么?我唯一能想到的就是重写OnWindowResize。在那里,将画布的高度和宽度设置为视框的视口高度和视口宽度。 – kformeck

+0

我会重新考虑使用'ViewBox',而不是'DockPanel'。 “ViewBox”的主要目的是在调整大小时保持宽高比和缩放比例,在这种情况下,你需要一个画布自动填充'ViewBox'将阻止的可用空间。您可以考虑尝试将Canvas的'Width'绑定到ViewBox的'Width',然后绑定'Height',但使用转换器来减去'TextBlock'的高度;但这真的很难看。 @kformeck – Matt