2014-01-17 50 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