鼠标滚轮在功能区中的列表框上滚动 [WPF]

Posted

技术标签:

【中文标题】鼠标滚轮在功能区中的列表框上滚动 [WPF]【英文标题】:Mousewheel scrolling on a Listbox within a Ribbon [WPF] 【发布时间】:2018-06-18 18:34:16 【问题描述】:

我有一个 带有两个选项卡的功能区,其中一个选项卡包含一个列表框,其中包含自动生成的内容。

我希望鼠标滚轮可以滚动列表框内容,并尝试了很多方法,但鼠标滚轮只能切换功能区选项卡。

以下是我尝试过的一种解决方案,我尝试从功能区释放鼠标控件并将其提供给 ListBox,但到目前为止我还没有成功。有没有合适的方法来做到这一点?我错过了什么吗?

xml

<Ribbon Name="ribbonMain">
   <RibbonTab Header="Home">
      <RibbonGroup Header="Employees" Width="200">
         <ListBox x:Name="empListBox" ItemsSource="Binding SelectedEmployees" 
             Width="180" 
             MouseEnter="empListBox_MouseEnter" 
             MouseLeave="empListBox_MouseLeave">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <CheckBox Content="Binding Path=FirstName" IsChecked="Binding IsChecked"></CheckBox>
                    </DataTemplate>
                </ListBox.ItemTemplate>
          </ListBox>
     </RibbonGroup>

xaml.cs

 private void empListBox_MouseEnter(object sender, MouseEventArgs e)
    
        if (sender is ListBox)
        
            ribbonMain.ReleaseMouseCapture();
            ((ListBox)sender).CaptureMouse();
        
    

    private void empListBox_MouseLeave(object sender, MouseEventArgs e)
    
        ((ListBox)sender).ReleaseMouseCapture();
        ribbonMain.CaptureMouse();
    

【问题讨论】:

【参考方案1】:

我认为问题在于ListBox 本身不能真正对鼠标捕获做任何事情。我认为实际上是滚动查看器ListBox 模板中需要接收滚轮事件。

尝试像这样更改鼠标处理程序:

private void empListBox_MouseEnter(object sender, MouseEventArgs e)

    Mouse.Capture(empListBox, CaptureMode.SubTree);


private void empListBox_MouseLeave(object sender, MouseEventArgs e)

    empListBox.ReleaseMouseCapture();

这将使鼠标事件对持有捕获的元素可见 *和* 其后代元素,包括滚动查看器。

【讨论】:

很有趣,很高兴知道以供将来参考。谢谢!

以上是关于鼠标滚轮在功能区中的列表框上滚动 [WPF]的主要内容,如果未能解决你的问题,请参考以下文章

WPF是不是有鼠标滚轮上下滚动事件

ScrollViewer 鼠标滚轮不滚动

鼠标滚轮自己有时会自动滚的啊

WPF:如何在拖动 ListView 项目时允许在 ListView 中使用鼠标滚轮滚动?

网页不能用鼠标滚轮控制滚动条 我鼠标滚轮上下滚动。。但网页没反应。这是怎么回事。。怎么修复。。

用鼠标滚轮拖动滚动条的时候老自动往上去