簡體   English   中英

ScrollViewer 鼠標滾輪不滾動

[英]ScrollViewer mouse wheel not scrolling

我目前正在處理我的第一個 WPF 項目並嘗試使ListView可滾動。 起初我認為這可以通過簡單地限制ListView的寬度和高度來輕松完成,從而在內容超出其空間時強制滾動條自動出現。 起初這似乎很好,但由於處理的PreviewMouseDown事件(允許拖動列表的項目),它在選擇項目后不起作用。

第二次嘗試(使用ScrollViewer

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

當然,只要列表的內容大於其最大高度,就會產生第二個滾動條。 選擇項目后拖動欄仍然不起作用。

第三次(相當愚蠢的)嘗試(禁用滾動條重復)

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

這刪除了滾動條重復並通過鼠標滾輪啟用滾動但禁用了滾動條,因此您無法通過單擊和拖動它來移動。

第四次嘗試ScrollViewer恆定大小)

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

ListView刪除寬度/高度約束並將其移動到ScrollViewer 這將啟用滾動條並刪除重復項。 不幸的是鼠標滾輪不再工作(拖動滾動條工作正常)。

有人可以向我解釋為什么鼠標滾輪不再工作以及如何解決這個問題嗎?

編輯也許我應該回到我的第一個解決方案。

顯然, ListView的模板已經包含一個ScrollViewer 剩下的問題是,由於處理的PreviewMouseDown事件(在這種情況下,通過 MouseWheel 滾動仍然有效),我無法在選擇項目后拖動滾動條。 我是否應該以不同的方式處理項目的拖動(在想要添加滾動條之前,它對我來說很好用)? 或者有沒有辦法檢測光標是否在滾動條上方(這樣我就可以取消選擇啟用滾動的項目)? 或者還有其他建議嗎?

這可能會幫助你..

private void ListViewScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
   ScrollViewer scv = (ScrollViewer)sender;
   scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta);
   e.Handled = true;
 }

這可能是最舒適的解決方案:

<ListView.Template>
    <ControlTemplate>
        <ScrollViewer>
            <ItemsPresenter></ItemsPresenter> 
        </ScrollViewer>
    </ControlTemplate>
</ListView.Template>

對我來說這有效:

<ListView.Template>
    <ControlTemplate>
        <!-- Empty template to allow ScrollViewer to capture mouse scroll -->
        <ItemsPresenter />
    </ControlTemplate>
</ListView.Template>

而不是這個:

<ListView.Template>
    <ControlTemplate>
        <ScrollViewer>
            <ItemsPresenter></ItemsPresenter>
        </ScrollViewer>
    </ControlTemplate>
</ListView.Template>
<ScrollViewer Background="Transparent">

如果Background為 null,則鼠標滾輪將不會在ScrollViewer工作。 您可以將Background設置為Transparent或其他值。

就我而言,這有幫助:

<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

我想對 Rocky 提供的解決方案添加一些評論。 它對我來說很好用,但后來我需要在不同的窗口中使用它來滾動Grid 我遇到了一個問題: ScrollViewer沒有滾動到底部。 原因是因為嘗試設置無效的VerticalOffset值。 下面的代碼對我來說很好用(只需要更改PreviewMouseWheel處理程序:

private void UIElement_OnPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
    ScrollViewer scroll = (ScrollViewer)sender;
    if (e.Delta < 0)
    {
        if (scroll.VerticalOffset - e.Delta <= scroll.ExtentHeight - scroll.ViewportHeight)
        {
            scroll.ScrollToVerticalOffset(scroll.VerticalOffset - e.Delta);
        }
        else
        {
            scroll.ScrollToBottom();
        }
    }
    else
    {
        if (scroll.VerticalOffset + e.Delta > 0)
        {
            scroll.ScrollToVerticalOffset(scroll.VerticalOffset - e.Delta);
        }
        else
        {
            scroll.ScrollToTop();
        }
    }
    e.Handled = true;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM