1

TabControl 内に Scrollviewer があり、何らかの理由でタブを変更すると、ScrollViewer が 12 の Horizo​​ntalOffset にジャンプします。奇妙なレイアウトですが、スクローラー内のすべてを印刷可能にする必要があったため、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 のマージンが画面外にスクロールされていることに注目してください。この動作を防止または回避するにはどうすればよいですか? 私の場合、レイアウトがかなりぎこちなく見えます。

4

1 に答える 1

2

RequestBringIntoView にフックする必要があるようです:

private void ListView_RequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
{
    e.Handled = true;
}

かなり単純な解決策のようです。

于 2009-08-10T20:22:51.810 に答える