2012-07-02 32 views
2

我一直在嘗試在Windows 8 metro風格的應用程序中工作,我只是無法得到正確的屬性,它的工作。這是我想要發生的事情:在metro風格的統一的文本縮放XAML ScrollViewer

我有一個包含StackPanel的ScrollViewer。 RichTextBoxes被添加到堆棧面板(來自服務器的流式文本數據)。它有效地像一個控制檯。所以我的佈局大致是這樣的:

<ScrollViewer> 
    <StackPanel x:Name="outputStackPanel"/> 
</ScrollViewer> 

我期望的行爲是這樣的:我 希望文本在與屏幕尺寸的水平方向均勻擴展,然後在ScrollViewer中垂直滾動。也就是說,我使用的字體是固定寬度的字體,無論屏幕大小如何,我都希望顯示相同數量的ascii字符。

此外,我有一個應用程序選項來包裝文本或不包裝文本到屏幕上。這意味着,當文本包裝時,它應該旋轉到固定的屏幕寬度,但是當它不是時,ScrollViewer應該可以水平滾動,但是在滾動時,在任何點大致相同數量的字符應該水平可見。

我嘗試了幾種方法來做到這一點,並沒有一個成功。我試着加入了視框,就像這樣:

<ScrollViewer> 
    <Viewbox Stretch="UniformToFill" StretchDirection="UpOnly"> 
    <StackPanel x:Name="outputStackPanel" /> 
    </ViewBox> 
</ScrollViewer> 

雖然這看起來在獲得出現在合適的尺寸文字方面的工作,它不允許文本換行,當文本換行是。內容在右側簡單切斷。

我目前的解決方法是檢查屏幕分辨率並對字體大小進行粗略估計以使其正確顯示,但這並不理想,因爲它不是確切的,因此不同的分辨率會獲得大量不同的可見字符並且爲了本申請的目的,可見字符的數量是重要的。

+0

您是否僅限ScrollViewer垂直滾動,例如:使用? –

回答

4

我已經能夠得到它的工作,但不幸的是,我不認爲有一個答案,將自動工作的任何字體。我可能是錯的,但這是我如何得到它的工作:

我選擇了一個固定寬度的字體(Consolas)和一個特定的大小。我認爲尺寸不重要。

選擇字體大小後,我將RichTextBlock放入一個ViewBox並計算出我需要設置RichTextBlock以獲得屏幕上我想要的字符(或列)的確切數量。在字體大小爲13.333時,爲了準確獲得60列,我需要440的寬度。

在ViewBox中使用13.333字號和440固定寬度,無論屏幕如何,我總能得到60列分辨率或方向和文字包裝。 現在,這是工作,我需要解決您的問題做同樣的事情,禁用文字包裝。

您希望文本能夠從屏幕上流出,並允許用戶在任一方向平移,但您總是需要固定數量的列(在我的示例中爲60)。爲了實現這一點,我從RichTextBox中刪除了固定寬度,並計算出ScrollViewer需要設置的縮放級別,以便始終獲得60列寬。事實證明,縮放級別是當前屏幕寬度除以440(我爲此特定字體和大小創建的神奇寬度)。

所以,這裏是XAML:

<ScrollViewer x:Name="Scroller" ZoomMode="Disabled" HorizontalScrollBarVisibility="Visible" > 
     <RichTextBlock x:Name="TextBlock"> 
      <Paragraph FontSize="13.333" FontFamily="Consolas"> 
       <Run Text="…" FontFamily="Consolas"/> 
      </Paragraph> 
     </RichTextBlock> 
    </Viewbox> 
</ScrollViewer> 

對於自動換行ON:

TextBlock.Width=440 
Scroller. ZoomToFactor(1.0f) 

對於自動換行關:

TextBlock.Width=Auto 
Scroller.ZoomToFactor((float)Window.Current.Bounds.Width/440); 

它改變縮放級別時是很重要的窗口大小改變。這可能是因爲用戶旋轉了設備,因爲他們連接了外部監視器,因爲您已進入快照視圖等。您可以通過訂閱Window.Current.SizeChanged事件來獲得通知。在事件內部,請務必使用傳遞給您的參數,因爲此時窗口實際上並未改變大小。所以:

void Current_SizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e) 
{ 
    Scroller.ZoomToFactor((float)e.Size.Width/440); 
} 

最後,顯然440的寬度是依賴於特定的字體,字體大小和事實,我總是想顯示60列。一旦我想出來了,只要我使用相同的字體和字體大小,就不應該改變任何顯示大小。如果你想讓用戶選擇不同的字體,你將不得不找出一種方法來動態計算。我在20分鐘的搜索中找不到任何答案。也許別人可以找到。

0

您可以嘗試Viewbox控件。它調整了它的內容,所以你不必擔心屏幕分辨率和內容。

C#的文檔是here。還有一個JS版本。

here是一個很好的關於縮放地鐵應用程序的MS指南,你可以查看一些其他的想法。

+0

我試過了(看我原來的帖子)。它不會像我期待的那樣工作。 –