[英]When is a XAML (UWP) GridView completely loaded?
<GridView
Name="Slider"
ItemsSource="{Binding Node.Contents}"
Loaded="SliderLoaded"
.../>
ViewModel
初始化是異步的,在那我設置綁定中引用的Node
屬性。
這是項面板的樣式:
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<ItemsStackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
關於后面的代碼:
private async void SliderLoaded(object sender, RoutedEventArgs e)
{
// I get a null reference exception trying to access the GridView scrollViewer here
await Task.Delay(150); // [hack] wait a bit for the view tree and binding to be ready
// the scrollViewer is accessible after the delay
}
這就是我訪問ScrollViewer的方式:
public static ScrollViewer GetScrollViewer(this DependencyObject element)
{
if (element is ScrollViewer)
{
return (ScrollViewer)element;
}
for (var i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
{
var child = VisualTreeHelper.GetChild(element, i);
var result = GetScrollViewer(child);
if (result != null)
return result;
}
return null;
}
閱讀文檔和其他SO答案后,“已加載”的事件處理程序將類似於創建和可用所有子視圖和綁定的地方,但是正如您在注釋中所看到的那樣,它不起作用。
我還嘗試了DataContextChanged
事件處理程序,結果相同。
如何或何時能100%確定網格scrollViewer和項目到位?
您沒有指定如何獲取GridView的ScrollViewer。 我假設您正在使用VisualTreeHelper這樣做?
這對我有用:
<GridView Loaded="GridView_Loaded"/>
private void GridView_Loaded(object sender, RoutedEventArgs e)
{
var scrollViewer = ((UIElement)sender)
.ChildrenBreadthFirst()
.OfType<ScrollViewer>()
.First();
}
public static class Extensions
{
public static IEnumerable<UIElement> ChildrenBreadthFirst(this UIElement element)
{
var queue = new Queue<UIElement>();
queue.Enqueue(element);
while (queue.Count > 0)
{
element = queue.Dequeue();
var count = VisualTreeHelper.GetChildrenCount(element);
for (var i = 0; i < count; i++)
{
var child = (UIElement)VisualTreeHelper.GetChild(element, i);
yield return child;
queue.Enqueue(child);
}
}
}
}
對困惑感到抱歉。 我的代碼正在運行,但我沒有意識到。 問題是我有一個獲取ScrollView和其他內容的功能,以查找項目並進行動畫滾動。 那里有ScrollView,但是TaskCompletionSource
中包裝的代碼中的其他部分卻無聲地失敗了。
無論如何,這一切的整點是編程滾動GridView控件,當我更換了都沒了所有的問題ItemsStackPanel
用StackPanel
在ItemsPanelTemplate
。
抱歉打擾了,謝謝大家。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.