TabControl 内に Scrollviewer があり、何らかの理由でタブを変更すると、ScrollViewer が 12 の HorizontalOffset にジャンプします。奇妙なレイアウトですが、スクローラー内のすべてを印刷可能にする必要があったため、ListView を単独でスクロールさせることは簡単にできませんでした。
そこで、TabControl の SelectionChanged イベントで次の行を試しました。
Console.WriteLine(Scroller.HorizontalOffset);
Scroller.ScrollToHorizontalOffset(0);
Console.WriteLine(Scroller.HorizontalOffset);
そして、WriteLine() への両方の呼び出しに対して 12 を出力します...これも移動しませんが、実際の UI からスクロールできます。
この奇妙な動作の原因を知っている人はいますか?
投稿する適切なコードを見つけようとしますが、これは大規模なプロジェクトであり、サンプル ソリューションで再現するのは難しい場合があります。
他の情報:
- この問題は、コンテンツが水平方向にスクロールできるほど大きい場合にのみ発生します。
- 水平スクロールバーと垂直スクロールバーの表示は自動ですが、非表示または表示に設定されていると問題が発生します。
アップデート:
ScrollViewer 内にある ListView をクリックして項目を選択すると、ScrollViewer は同じ 12 ピクセルのオフセットまでスクロールします。私の問題は、ListView がフォーカスを取得することに関連している可能性がありますか? ListView は、フォーカスを受け取ったときに、それ自体で BringIntoView() を呼び出しますか?
この Xaml は問題を再現します。
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window11" Height="300" Width="300">
<TabControl>
<TabItem Header="Tab One">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<ListBox Margin="25,0,0,0" Width="2000">
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
</ListBox>
</ScrollViewer>
</TabItem>
<TabItem Header="Tab Two">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<ListBox Margin="25,0,0,0" Width="2000">
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
<ListBoxItem>WOOT WOOT WOOT WOOT</ListBoxItem>
</ListBox>
</ScrollViewer>
</TabItem>
</TabControl>
</Window>
これを XamlPad で平手打ちし、実行します。Tab ヘッダーをクリックすると、ScrollViewer が自動的にスクロールすることに気付きます。それをいじって、ListBox のマージンが画面外にスクロールされていることに注目してください。この動作を防止または回避するにはどうすればよいですか? 私の場合、レイアウトがかなりぎこちなく見えます。