问候,
我已设法使用http://www.codeproject.com/Tips/125583/ScrollIntoView-for-a-DataGrid-when-using-MVVM.aspx滚动到所选项目,但这只会滚动,直到它到达所选项目.
我希望所选项目显示在datagrid的TOP,目前它显示在datagrid的底部.
有没有办法实现这个目标?
解决方法
这似乎有两个场景.一种是在DataGrid中手动选择项目,另一种是在viewmodel中SelectedItem的source属性发生变化时.您提供的链接中的行为将被触发.
ScrollIntoView的工作方式是,如果新选择的项目位于先前选择的项目之上(将其保留在顶部),则向上滚动;如果新选择的项目位于下方(将其保留在底部),则向下滚动,如果新选择的项目位于下方,则向下滚动所选项目已对用户可见.因此,您不会总是在DataGrid的底部获取所选项目
如果希望SelectedItem始终显示在网格的顶部(如果可能),则可以在执行grid.ScrollIntoView(grid.SelectedItem,null);之前滚动到底部.这具有副作用,即SelectedItem将始终显示在顶部,即使它是由鼠标,键盘等选择的.
为了能够以编程方式滚动DataGrid,您需要创建一个从DataGrid派生的ScrollableDataGrid
public class ScrollableDataGrid : DataGrid { private IScrollProvider m_scrollProvider; public ScrollableDataGrid() { m_scrollProvider = OnCreateAutomationPeer() as IScrollProvider; } public void ScrollToBottom() { while (m_scrollProvider.VerticalScrollPercent < 100) { m_scrollProvider.Scroll(ScrollAmount.NoAmount,ScrollAmount.LargeIncrement); } } }
void Associatedobject_SelectionChanged(object sender,SelectionChangedEventArgs e) { if (sender is ScrollableDataGrid) { ScrollableDataGrid grid = (sender as ScrollableDataGrid); if (grid.SelectedItem != null) { grid.dispatcher.BeginInvoke(delegate { grid.ScrollToBottom(); grid.UpdateLayout(); grid.ScrollIntoView(grid.SelectedItem,null); }); } } }
原文地址:https://www.jb51.cc/csharp/100570.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。