如何使滾動規則總是在ListView自動結束時在WPF中沒有焦點?ListView滾動到最後一個項目WPF C#
7
A
回答
2
3
您可以使用此,它的工作對我來說:
this.myListView.ScrollIntoView(myListView.Items [myListView.Items.Count-1]);
,如果您需要更高級的細節,你可以參考,這post
1
自@ pduncan的答案不包括實際的代碼,這裏是他們張貼着只有細微的修改,從我的鏈接代碼:
public class ListBoxExtenders : DependencyObject
{
public static readonly DependencyProperty AutoScrollToEndProperty = DependencyProperty.RegisterAttached("AutoScrollToEnd", typeof(bool), typeof(ListBoxExtenders), new UIPropertyMetadata(default(bool), OnAutoScrollToEndChanged));
/// <summary>
/// Returns the value of the AutoScrollToEndProperty
/// </summary>
/// <param name="obj">The dependency-object whichs value should be returned</param>
/// <returns>The value of the given property</returns>
public static bool GetAutoScrollToEnd(DependencyObject obj)
{
return (bool)obj.GetValue(AutoScrollToEndProperty);
}
/// <summary>
/// Sets the value of the AutoScrollToEndProperty
/// </summary>
/// <param name="obj">The dependency-object whichs value should be set</param>
/// <param name="value">The value which should be assigned to the AutoScrollToEndProperty</param>
public static void SetAutoScrollToEnd(DependencyObject obj, bool value)
{
obj.SetValue(AutoScrollToEndProperty, value);
}
/// <summary>
/// This method will be called when the AutoScrollToEnd
/// property was changed
/// </summary>
/// <param name="s">The sender (the ListBox)</param>
/// <param name="e">Some additional information</param>
public static void OnAutoScrollToEndChanged(DependencyObject s, DependencyPropertyChangedEventArgs e)
{
var listBox = s as ListBox;
if (listBox != null)
{
var listBoxItems = listBox.Items;
var data = listBoxItems.SourceCollection as INotifyCollectionChanged;
var scrollToEndHandler = new System.Collections.Specialized.NotifyCollectionChangedEventHandler(
(s1, e1) =>
{
if (listBox.Items.Count > 0)
{
listBoxItems.MoveCurrentToLast();
listBox.ScrollIntoView(listBoxItems.CurrentItem);
}
});
if ((bool)e.NewValue)
data.CollectionChanged += scrollToEndHandler;
else
data.CollectionChanged -= scrollToEndHandler;
}
}
}
我修改它以使用MoveCurrentToLast
而不是使用listBox.Items[listBox.Items.Count - 1];
獲取最後一項。這樣做的原因(除了稍微清潔一點)是有邊緣的情況下,如果你有一個列表中重複項目,然後獲得listBox.Items.Count - 1
,然後滾動到該項目可能不會滾動到列表的末尾(它甚至可以向相反的方向滾動你!)。它會將您滾動到該項目的第一個實例。
0
@pduncan和@MattBurland的答案都有一些問題,主要是它們未能正確取消註冊行爲。
此實現將處理程序存儲在另一個附加屬性中,以便您可以通過綁定來打開和關閉行爲。
請注意,這適用於ListView
。如果您使用的是ListBox
,請將ListView
更改爲ListBox
。
public static class ListViewExtensions
{
public static readonly DependencyProperty AutoScrollToEndProperty = DependencyProperty.RegisterAttached("AutoScrollToEnd", typeof(bool), typeof(ListViewExtensions), new UIPropertyMetadata(OnAutoScrollToEndChanged));
private static readonly DependencyProperty AutoScrollToEndHandlerProperty = DependencyProperty.RegisterAttached("AutoScrollToEndHandler", typeof(NotifyCollectionChangedEventHandler), typeof(ListViewExtensions));
public static bool GetAutoScrollToEnd(DependencyObject obj) => (bool)obj.GetValue(AutoScrollToEndProperty);
public static void SetAutoScrollToEnd(DependencyObject obj, bool value) => obj.SetValue(AutoScrollToEndProperty, value);
private static void OnAutoScrollToEndChanged(DependencyObject s, DependencyPropertyChangedEventArgs e)
{
var listView = s as ListView;
if (listView == null)
return;
var source = (INotifyCollectionChanged)listView.Items.SourceCollection;
if ((bool)e.NewValue)
{
NotifyCollectionChangedEventHandler scrollToEndHandler = delegate
{
if (listView.Items.Count <= 0)
return;
listView.Items.MoveCurrentToLast();
listView.ScrollIntoView(listView.Items.CurrentItem);
};
source.CollectionChanged += scrollToEndHandler;
listView.SetValue(AutoScrollToEndHandlerProperty, scrollToEndHandler);
}
else
{
var handler = (NotifyCollectionChangedEventHandler)listView.GetValue(AutoScrollToEndHandlerProperty);
source.CollectionChanged -= handler;
}
}
}
使用方法如下:
<ListView local:ListViewExtensions.AutoScrollToEnd="{Binding Path=AutoScroll}">
我也使它成爲一個靜態類,因爲你不需要進行實例化(也不需要從DependencyObject
派生)。對INotifyCollectionChanged
的轉換已更改,以便錯誤顯示爲投射異常,而不是NRE。
0
對我來說,如果列表框中的每個記錄都不同,這些工作。如果它們是相同的,它就會滾動到匹配的第一個。
相關問題
- 1. 如何設置listview滾動一個項目一個項目
- 2. 的ListView砍最後一個項目
- 3. RecycleView不滾動到最後的項目
- 4. 使listview的最後一項滾動到屏幕中間
- 5. 道場網格不滾動到最後一個項目
- 6. 滾動到單擊最後一個項目
- 7. 滾動後無法點擊ListView項目
- 8. Listview項目滾動後只能點擊
- 9. C#wpf listview添加項目
- 10. 如何從ListView中獲取滾動中的最後一個隱藏項目?
- 11. 讓ListView滾動到所選項目
- 12. 將項目保存到共享首選項後,listview laggy滾動
- 13. 如何防止WPF列表框滾動過去的最後一個項目?
- 14. UICollectionView水平滾動不滾動,直到最後項目
- 15. 滾動ListView外的項目
- 16. WPF創建一個垂直滾動然後水平滾動的項目列表
- 17. ListView滾動到選定的項目
- 18. ExtJS的 - 滾動到最後一行(所選項目)
- 19. 停止觀看最後一個項目時滾動 - 與jQuery
- 20. 添加項目後,ListView不會滾動到底部
- 21. 單擊ListView項目時顯示下拉PopupWindow,然後滾動ListView?
- 22. 得到最後一個項目
- 23. 帶有20個項目的ListView在滾動時滯後
- 24. kendo ui移動listview無限滾動只顯示一個項目
- 25. Listview爲最後一項上的每個項目添加填充
- 26. 將第一個/最後一個列表框項目滾動到滾動視圖的中心
- 27. WPF ListView MouseOver項目
- 28. 滾動到下一個ng-repeat項目
- 29. UICollectionView滾動到一個項目
- 30. 得到最後一個項目/浮
這是更正確的解決方案。令人印象深刻的是,只有37行(加評論)在WPF中完成了某些事情。 – Grault 2016-02-24 22:11:37
鏈接過時,將代碼*包含在您的答案中會很有幫助* – 2016-03-09 15:01:06