71

私は現在、最初の WPF プロジェクトに取り組んでおり、ListViewスクロール可能にしようとしています。ListView最初は、の幅と高さを制限して、コンテンツがそのスペースを超えるたびにスクロールバーが自動的に表示されるようにするだけで、これを簡単に実行できると思いました。これは最初は問題ないように見えましたが、処理されたPreviewMouseDownイベント (リストの項目をドラッグできるようにする) が原因で、項目を選択した後は機能しません。

2 回目の試行( を使用ScrollViewer)

<ScrollViewer>
    <ListView ItemsSource="{Binding FileViewModels}"
              PreviewMouseDown="ListView_MouseMove"
              Height="450" Width="200"/>
</ScrollViewer>

もちろん、これにより、リストのコンテンツが最大の高さよりも大きくなるたびに、2 つ目のスクロールバーが表示されました。また、アイテムを選択した後も、バーをドラッグしても機能しませんでした。

3 回目の(かなりばかげた)試行(スクロールバーの複製を無効にする)

<ScrollViewer>
    <ListView ItemsSource="{Binding FileViewModels}"
              PreviewMouseDown="ListView_MouseMove"
              Height="450" Width="200"
              ScrollViewer.VerticalScrollBarVisibility="Disabled"
              ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
</ScrollViewer>

これにより、スクロールバーの重複が削除され、マウスホイールによるスクロールが有効になりましたが、スクロールバーが無効になったため、クリックしてドラッグしても移動できませんでした。

4 回目の試行(の定数サイズScrollViewer)

<ScrollViewer Height="450" Width="200">
    <ListView ItemsSource="{Binding FileViewModels}"
              PreviewMouseDown="ListView_MouseMove"/>
</ScrollViewer>

から幅/高さの制約を削除し、ListViewに移動しましたScrollViewer。これにより、スクロールバーが有効になり、重複が削除されます。残念ながら、マウス ホイールはもう機能しません (スクロール バーのドラッグは正常に機能します)。

マウスホイールが機能しなくなった理由と、これを修正する方法を誰かに説明してもらえますか?

編集 たぶん、最初の解決策に戻る必要があります。

明らかに、ListViewのテンプレートには既にScrollViewer. 残りの問題は、処理されたイベントのために項目を選択した後にスクロールバーをドラッグできないことですPreviewMouseDown(その場合、MouseWheel によるスクロールは引き続き機能します)。アイテムのドラッグを別の方法で処理する必要がありますか (スクロールバーを追加する前に、私にとってはうまくいきました)? または、カーソルがスクロールバーの上にあるかどうかを検出する方法はありますか (そのため、スクロールを有効にするアイテムの選択を解除できます)。それとも他の提案はありますか?

4

6 に答える 6

115

これはあなたを助けるかもしれません..

private void ListViewScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
   ScrollViewer scv = (ScrollViewer)sender;
   scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta);
   e.Handled = true;
 }
于 2013-04-26T11:52:59.970 に答える
26

これはおそらく最も快適なソリューションです。

<ListView.Template>
    <ControlTemplate>
        <ScrollViewer>
            <ItemsPresenter></ItemsPresenter> 
        </ScrollViewer>
    </ControlTemplate>
</ListView.Template>
于 2014-06-03T23:29:44.813 に答える
6

私の場合、これは役に立ちました:

<ScrollViewer ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Auto" >
    <DataGrid x:Name="dataGrid" SelectionMode="Single" ItemsSource="{Binding}"  SelectedValuePath="{Binding Item}" AutoGenerateColumns="True">
    </DataGrid>
</ScrollViewer>

VerticalScrollBarVisibility設計により、外側のスコープ、つまり で属性が無効化されていましたScrollViewer

于 2016-10-13T07:35:18.793 に答える