2012-07-02 35 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

我试过了(看我原来的帖子)。它不会像我期待的那样工作。 –