如何在等待组合框渲染时显示等待标记?

时间:2012-03-14 13:30:55

标签: .net wpf vb.net xaml

在WPF窗口中绑定组合框时,我遇到了一个奇怪的问题。

我正在加载一个List对象,通过它的.ItemsSource,在Window Load上填充组合框,然而,它没有填充。

至少,直到点击箭头。单击箭头后,窗口会冻结,大约一分钟后,会显示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 个答案:

答案 0 :(得分:4)

我不确定是否有更好的方法,但是......

如果您想在第一次打开ComboBox时想要避免等待有多件商品,可以将ComboBox.IsDropDownOpen设为True并返回False

编辑: 一点点的研究出现了VirtualizingStackPanel。基本上,您的XAML将如下所示:

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

我能够立即查看带有4万个数字的ComboBox

答案 1 :(得分:1)

您正在混淆加载渲染。在下面的示例中,get_由Window_Loaded调用,而不是通过CB上的单击调用。一旦窗口第一次显示,cb对象已经有了它的数据 - 下拉列表就不会在默认状态下呈现。就像让ComboBox预渲染那样只是没有意义,因为组合框的默认状态只是单行。将SelectedIndex指定为1,您将看到首次显示Widow时的值 - 证明组合框已有其数据。

    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;
    }