web-dev-qa-db-ja.com

WPFフレームにScrollViewer(垂直スクロール用)を設定する正しい方法は?

このようなフレームに垂直スクロールバーを定義することの違いを誰かが知っていますか:

        <ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto">
            <Frame Name="Frame1"
                   ScrollViewer.CanContentScroll="True" />
        </ScrollViewer>

またはこのように:

        <ScrollViewer Grid.Row="2">
            <Frame Name="Frame1"
                   ScrollViewer.VerticalScrollBarVisibility="Auto"
                   ScrollViewer.CanContentScroll="True" />
        </ScrollViewer>

このフレームはWebBrowserコントロールにネストされ、最初に設定すると垂直スクロールバーが正しく表示され、スクロール(自動)する必要がある場合にのみ表示されます。 2番目の方法で設定すると、垂直スクロールバーは機能しますが、スクロールする必要がない場合(表示)でも常に表示されます。

1番目のオプションは自分のニーズを満たしているので使用しますが、間違って設定したとしても驚くことはありません。

ありがとう!

12
JDL

ScrollViewer.VerticalScrollBarVisibilityまたはScrollViewer.HorizontalScrollBarVisibility添付プロパティを使用する場合、Frameには影響しません。

<ScrollViewer Margin="225.667,-4,0,296.939" HorizontalAlignment="Left" Width="221.667">
        <Frame Content="Frame" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Hidden" Source="UserControl2.xaml" Background="#FFDE5454"/>
</ScrollViewer>

上記の例では、ScrollViewer.VerticalScrollBarVisibilityScrollViewer.HorizontalScrollBarVisibilityの両方の添付プロパティを使用しました。そのコードの結果は、あなたが期待するものとは正反対です。 HorizontalScrollBarは表示されていません... VerticalScrollBarは引き続き表示されます。

だから、これがあなたが使うべきものなのです

<ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto">
        <Frame Name="Frame1" />
</ScrollViewer>

たとえば、ListBoxでこれを試すと、結果は異なります。

これは、次のコードの結果です。

enter image description here

<ScrollViewer Margin="225.667,0,0,12.761" Height="280.178" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="221.667">
        <ListBox ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Visible" Background="Orange" ItemsSource="{Binding Collection}" DisplayMemberPath="Property1" />
</ScrollViewer>

これは、これらの添付プロパティがListBox内のScrollViewerに影響するようになり、期待どおりに親ScrollViewerに影響を与えないためです。

したがって、この小さな実験から、ScrollViewer.VerticalScrollBarVisibility添付プロパティは、親のScrollViewerではなく、コントロールのテンプレート内に存在するScrollViewerに影響を与えたい場合のためのものであると想定します。したがって、たとえば、親DockPanelに影響するDockPanel.Dockとしては機能しないと思います。

28
Kapitán Mlíko