簡體   English   中英

什么時候可以完全加載XAML(UWP)GridView?

[英]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控件,當我更換了都沒了所有的問題ItemsStackPanelStackPanelItemsPanelTemplate

抱歉打擾了,謝謝大家。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM