WPF DataGrid:当单击单元格时,如何停止自动滚动?

15 浏览
0 Comments

WPF DataGrid:当单击单元格时,如何停止自动滚动?

问题:

如果我的DataGrid不完全可见(水平和垂直滚动条显示),并且我点击一个部分可见的单元格,网格会自动滚动以将该单元格显示出来。我不希望这种情况发生。我尝试过使用RequestBringIntoView,像这样:

private void DataGrid_RequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)

{

e.Handled = true;

}

但是这没有任何效果。

我尝试过的方法:

- 我的单元格是自定义的UserControls;我尝试在构成单元格的所有UserControls上放置一个RequestBringIntoView的事件处理程序,并尝试处理该事件,以为也许仅仅在DataGrid上处理RequestBringIntoView不够。但是这没有起作用。

- 将DataGrid放在ScrollViewer中,并处理ScrollViewer的RequestBringIntoView事件。这实际上可以阻止自动滚动行为,但在我的情况下,将DataGrid放在ScrollViewer中是不可取的,所以我需要找到另一种解决方案。

我不确定如何停止这种行为,有什么想法吗?

0
0 Comments

WPF DataGrid: 如何在点击单元格时停止自动滚动?

问题原因:DataGrid控件在点击单元格时会自动滚动,这可能会导致用户体验不佳。

解决方法:通过修改DataGrid的模板来访问其内部的ScrollViewer,并在ScrollViewer上添加事件处理程序来停止自动滚动。以下是从Blend生成的默认模板,其中包含一个在ScrollViewer上为RequestBringIntoView事件添加的处理程序:


    
        
            
                
                    
                        
                    
                
            
            
        
    

代码中的""处省略了一些模板的具体实现细节,不影响解决问题的方法。

以上就是解决WPF DataGrid自动滚动问题的原因和方法。通过修改DataGrid的模板,我们可以访问其内部的ScrollViewer,并在ScrollViewer上添加事件处理程序来停止自动滚动。

0
0 Comments

问题是当单击单元格时,WPF DataGrid会自动滚动。为了解决这个问题,可以在DataGrid的RowStyle中定义一个EventSetter,调用一个处理程序来阻止行被带入视图:

XAML:


    
        
    

处理程序:

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

我尝试了这个解决方案,它确实有效。但是,这种方法的问题是,当你尝试通过按箭头键来滚动时,实际上并没有滚动。你有没有想到任何解决方法?

0
0 Comments

问题的原因是当单击单元格时,DataGrid会自动滚动到该单元格所在的行。为了停止自动滚动,可以通过捕获RequestBringIntoView事件并将其标记为已处理来实现。代码如下:

var scp = TreeHelper.FindVisualChild(this.datagrid);
scp.RequestBringIntoView += (s, e) => e.Handled = true;

这里使用了ScrollContentPresenter,因为它在可视树中位于ScrollViewer的下方。这种方法可以解决问题。

然而,有人指出上述代码中的匿名事件处理程序会导致整个视图/视图模型的内存泄漏。因此,不建议使用这种方法。

解决方法可以通过以下步骤实现:

1. 找到DataGrid的ScrollViewer或ScrollContentPresenter。

2. 订阅ScrollViewer或ScrollContentPresenter的RequestBringIntoView事件。

3. 在事件处理程序中将e.Handled设置为true,以阻止自动滚动。

希望这能对你有所帮助!

0