Как я могу показать курсор ожидания во время ожидания комбинированного окна для рендеринга? - PullRequest
1 голос
/ 14 марта 2012

У меня странная проблема при связывании комбинированного списка в окне WPF.

Я загружаю объект List, чтобы заполнить комбинированный список через его .ItemsSource при загрузке окна, однако он не заполняется..

По крайней мере, пока стрелка не нажата.Как только стрелка нажата, окно замирает, и через минуту или около того в нем отображается более 4000 записей.

Теперь список загружается, однако, когда я нажимаю на поле со списком,рендеринг занимает некоторое время, так как я могу показать курсор ожидания, пока он рендерит список?

Вот Xaml для него:

<ComboBox Grid.Column="1" 
                      HorizontalAlignment="Stretch" Margin="3" Name="tUser" VerticalAlignment="Stretch"
                      DisplayMemberPath="UsersName" SelectedValuePath="UserID" SelectedValue="0"/>

И выделенный код:

Private Sub CreateTask_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    Using New WaitCursor
        _LA.Show()
        Me.tOrder.ItemsSource = GetOrderList()
        Me.tUser.ItemsSource = GetUserList()
        _LA.Hide()
    End Using
End Sub

Private Function GetUserList() As List(Of UserTyping)
    Dim _Qry As New List(Of UserTyping)
    Using db As New DataAccess
        With db
            .QueryType = CmdType.InlineSQL
            .Query = "Select 0 As UserID, '-Select User-' As UsersName Union All Select userID As UserID, userFullName As UsersName From vwSelectUser"
            Using _Results = .GetResults()
                If _Results IsNot Nothing Then
                    If _Results IsNot Nothing Then
                        _Qry = (From row In _Results.Cast(Of DbDataRecord)()
                                    Select New UserTyping() With {
                                        .UserID = Common.IsNull(Of Long)(row, 0, 0),
                                        .UsersName = Common.IsNull(Of String)(row, 1, String.Empty)
                                        }).ToList()
                    Else
                        _Qry = New List(Of UserTyping)
                    End If
                End If
            End Using
        End With
    End Using
    Return _Qry
    _Qry.Clear()
End Function
Partial Public Class UserTyping
    Public Property UserID As Long
    Public Property UsersName As String
End Class

Ответы [ 2 ]

4 голосов
/ 14 марта 2012

Я не уверен, что есть лучший способ, но ...

Если вы хотите избежать ожидания при первом открытии ComboBox, когда в нем много элементов, вы можете установить ComboBox.IsDropDownOpen на True и обратно на False.

Edit: Немного исследований оказалось VirtualizingStackPanel . По сути, ваш XAML будет выглядеть так:

<ComboBox>
    <ComboBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />
        </ItemsPanelTemplate>
    </ComboBox.ItemsPanel>
</ComboBox>

Мне удалось просмотреть ComboBox с номерами 40k.

1 голос
/ 14 марта 2012

Вы путаете загрузку с рендерингом.В приведенном ниже примере get вызывается Window_Loaded, а НЕ нажатием на CB.Как только Окно впервые отключено, объект cb уже имеет свои данные - раскрывающийся список просто не отображается в состоянии по умолчанию.Это далеко от того, чтобы получить ComboBox для предварительного рендеринга, который просто не имеет смысла, так как стандартным состоянием комбинированного списка является только одна строка.Присвойте SelectedIndex значение 1, и вы увидите значение, когда вдова будет впервые отображена - свидетельство того, что в комбинированном ящике уже есть данные.

    public List<string> cbSource
    {
        get 
        {
            List<string> ss = new List<string>();
            for (int i = 0; i < 1000; i++)
            {
                ss.Add("jim_" + i.ToString());
                ss.Add("mary_" + i.ToString());
                ss.Add("steve" + i.ToString());
            }
            return ss;
        }
    }


    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        cb.ItemsSource = cbSource;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...