2

Windows 8 のメトロ スタイル アプリケーションで何かを動作させようとしてきましたが、動作するための適切なプロパティを取得できません。これが私がしたいことです:

StackPanel を含む ScrollViewer があります。RichTextBoxes がスタック パネルに追加されます (サーバーからのテキスト データのストリーミング)。コンソールのように効果的に機能します。したがって、私のレイアウトはおおよそ次のようになります。

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

私の望ましい動作は次のとおりです。テキストを画面サイズの水平方向に均一に拡大縮小してから、ScrollViewer で垂直にスクロールします。つまり、私が使用しているフォントは固定幅フォントであり、画面サイズに関係なく、同じ数の ASCII 文字を表示したいということです。

さらに、テキストを画面に折り返すか、折り返さないかをアプリで選択できます。つまり、テキストが折り返されている場合は、固定された画面幅に折り返される必要がありますが、そうでない場合、ScrollViewer は水平方向にスクロール可能である必要がありますが、スクロール中にほぼ同じ数の文字が水平方向に表示される必要があります。

これを行うためにいくつかの方法を試しましたが、どれも成功していません。次のように、ViewBox を追加しようとしました。

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

これは、テキストを適切なサイズで表示するという点では機能しているように見えますが、テキストの折り返しがオンの場合、テキストを折り返すことはできません。コンテンツは右側で単純に切り取られています。

私の現在の回避策は、画面の解像度を確認し、フォントサイズを大まかに見積もって正しく表示することですが、これは正確ではないため理想的ではありません。解像度が異なると、表示される文字数が大きく異なります。このアプリケーションの目的では、表示可能な文字数が重要です。

4

2 に答える 2

4

私はそれを機能させることができましたが、残念ながら、どのフォントでも自動的に機能する答えはないと思います. 私は間違っているかもしれませんが、これが私がそれを機能させる方法です:

固定幅フォント (Consolas) と特定のサイズを選びました。サイズは関係ないと思います。

フォント サイズを選択した後、RichTextBlock を ViewBox に配置し、RichTextBlock を設定して画面に必要な文字 (または列) の正確な数を取得するために必要な WIDTH を正確に把握しました。13.333 のフォント サイズで正確に 60 列を取得するには、440 の幅が必要でした。

ViewBox 内で 13.333 のフォント サイズと 440 の固定幅を使用すると、画面の解像度や向きに関係なく、常に正確に 60 列を取得でき、テキストが折り返されます。それがうまくいったので、ワードラップを無効にして同じことをするあなたの問題に取り組む必要がありました.

テキストが画面の外に出て、ユーザーがどちらの方向にもパンできるようにしたかったのですが、常に固定数の列 (私の例では 60) が必要でした。これを実現するために、RichTextBox から固定幅を削除し、常に 60 列幅にするために ScrollViewer をどのズーム レベルに設定する必要があるかを調べました。ズーム レベルは、現在の画面幅を 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>

ワードラップがオンの場合:

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分間の検索で、これに対する答えは見つかりませんでした。多分他の誰かがそれを見つけることができます。

于 2012-07-03T21:57:57.113 に答える
0

ビューボックスコントロールを試すことができます。コンテンツのサイズが変更されるため、画面の解像度などを気にする必要はありません。

C#のドキュメントはこちらです。JSバージョンもあります。

また、Metroアプリのスケーリングに関する優れたMSガイドがあります。他のアイデアを確認できます

于 2012-07-02T15:10:55.887 に答える