5

wpf TextBlock コントロール (.Net 3.5) でテキストを表示しています。テキストブロックの内容は、ユーザーがリスト ボックスで何を選択したかによって異なります。テキストは折り返されるので、水平スクロール バーは必要ありません。ただし、ウィンドウが表示できる量よりも多くのテキストがあることが多いため、垂直スクロール バーが必要です。

検索を開始すると、答えは TextBlock を ScrollViewer でラップすることであることがすぐにわかりました。ただし、それは機能しません (TM)。誰かが理由を解明するのを手伝ってくれることを願っています。

これは UI コードの構造です。

<Window x:Class=..>
    <StackPanel>
        <ListBox HorizontalAlignment="Stretch"
                 VerticalAlignment="Top"  Height="200"
                 SelectionChanged="listbox_changed" SelectionMode="Single">
        </ListBox>
        <Button Click="Select_clicked">Select</Button>
        <ScrollViewer VerticalScrollBarVisibility="Auto">
            <TextBlock Name="textblock" TextWrapping="Wrap"/>
        </ScrollViewer>
    </StackPanel>
</Window>

ユーザーがリスト ボックス内の項目を選択すると、この項目に関連付けられたテキストが TextBlock に表示されます。現状のコードだけで十分だと思っていたのですが、スクロール バーが表示されません。

問題の根本原因は、TextBlock のコンテンツを動的に更新することに関連している可能性があることと、TextBlock が新しいコンテンツに基づいてサイズを変更しないことです。TextBlock の Height を ActualHeight (コンテンツを変更した後) に設定することで機能するという関連性のある投稿を見つけました。しかし、そうではありませんでした(これによる影響は見られません)。

次に、ScrollViewer の高さを (設計時に) 設定すると、垂直スクロール バーが表示されます。たとえば、上記の xaml で 300 に設定した場合、最初に開いたウィンドウには、必要なときに (必要なときにのみ) 垂直スクロール バー付きの TextBlock が含まれるという点で、ほぼ良好な結果が得られます。しかし、ウィンドウを大きくすると (実行時にマウスでサイズを変更すると)、ScrollViewer は新しいウィンドウ サイズを利用せず、代わりに xaml に従ってその高さを維持しますが、もちろんそうではありません。

うまくいけば、私は明らかな何かを見落としました..

ありがとう!

4

1 に答える 1

10

ScrollViewer は StackPanel にあるため、コンテンツを表示するために必要なだけの垂直方向のスペースが与えられます。

DockPanel や Grid など、垂直方向のスペースを制限する親パネルを使用する必要があります。

<DockPanel>
    <ListBox DockPanel.Dock="Top" HorizontalAlignment="Stretch"
             VerticalAlignment="Top"  Height="200"
             SelectionChanged="listbox_changed" SelectionMode="Single">
    </ListBox>
    <Button DockPanel.Dock="Top" Click="Select_clicked">Select</Button>
    <ScrollViewer VerticalScrollBarVisibility="Auto">
        <TextBlock Name="textblock" TextWrapping="Wrap"/>
    </ScrollViewer>
</DockPanel>
于 2011-04-11T12:45:25.070 に答える