2013-07-23 57 views
0

我遇到了listbox.ScrollIntoView方法的問題 - 它不起作用。以下是代碼片段:ListBox.ScrollIntoView僅在延遲後才起作用

// the listbox is binded to a "Thumbnails" property 
this.Thumbnails = new VirtualizableCollection<RecordingThumbnailItem>(this.thumbnailsProvider) { ItemsStep = this.ThumbnailsStep }; 
this.listBox.ScrollIntoView(this.Thumbnails[thumbnailToSelect]); 

我注意到,如果我叫ScrollIntoView有點晚(來源後500毫秒例如用於綁定定義)一切正常。所以我認爲ScrollIntoView應該在控件獲得某些特定狀態後調用; 如果是這樣,我該如何檢測它?也許使用一些事件?最後,我只需要強制我的水平列表框來顯示右端的最後一項,而不是像往常一樣左側。也許還有其他方法存在?

+0

我在調用'ScrollIntoView'方法時沒有任何延遲。也許你的延遲是由'VirtualizableCollection'初始化引起的?你能否提供可行的代碼來表達你的問題,我們可以加載到一個新的項目中併爲你測試? – Sheridan

+0

有一些誤解。在我的情況下,ScrollIntoView根本不起作用。但是,如果我在縮略圖初始化和ScrollIntoView調用之間進行一些延遲(線程休眠) - 那麼它會起作用 – vklu4itesvet

+0

我們有@ vklu4itesvet的問題在於,對您而言,它不起作用,對我們來說它確實如此。因此,我建議你在代碼中有一些阻止它工作的東西。如果您希望我們幫助您找到解決方案,那麼您將不得不向我們顯示相關代碼。它可能由於許多原因而無法工作。 – Sheridan

回答

1

問題是代表每個項目的視圖還沒有被創建,所以視圖不能被滾動到屏幕上。

您可以使用Dispatcher排列ScrollIntoView()調用的優先級低於UI的優先級,該優先級給出UI生成視圖的時間。

試試這個:

this.Thumbnails = new VirtualizableCollection<RecordingThumbnailItem>(this.thumbnailsProvider) { ItemsStep = this.ThumbnailsStep }; 
Dispatcher.CurrentDispatcher.BeginInvoke(
    DispatcherPriority.ContextIdle, 
    new Action(() => this.listBox.ScrollIntoView(this.Thumbnails[thumbnailToSelect]) 
); 

您可能需要替換Dispatcher.CurrentDispatcherApplication.Current.Dispatcher如果CurrentDispatcher恰好是一個以外的UI之一。

+0

非常感謝!在我的例子DispatcherPriority.ApplicationIdle – vklu4itesvet

+0

的一個評論是的,在我的代碼中,這仍然有一個評論「希望這個工程每次」的效果。就我而言,它可以得到專家的確認,但似乎解決了這個問題。 – Steve

+0

需要告訴測試人員) – vklu4itesvet