【问题标题】:How can I show a waitcursor while waiting for a combobox to render?如何在等待组合框呈现时显示等待光标?
【发布时间】:2012-03-14 13:30:55
【问题描述】:

在 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

【问题讨论】:

  • 只需将代码从“ComboBox Click”事件移动到“form load”事件。您在此处提供的代码是用于将项目添加到列表而不是组合框。
  • 对不起,忘了先提这个,除非你使用多线程,否则加载你的应用程序仍然需要一段时间。
  • 请重新阅读我发布的代码。组合框是由拉取数据的函数填充的,而组合框点击事件中什么都没有

标签: .net wpf vb.net xaml


【解决方案1】:

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

如果想在第一次打开ComboBox时避免等待,因为它有很多项目,可以将ComboBox.IsDropDownOpen设置为True并返回False

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

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

我能够立即查看带有 40k 个号码的 ComboBox

【讨论】:

  • 我真正想做的只是让“WaitCursor”和 _LA 显示,直到组合框完全填充。换句话说,在该组合框完全加载之前,我不希望该窗口可用于操作。这样,点击组合框就没有时间了。
  • 我的编辑有没有可能完全消除这种等待时间?
  • 对不起,我对 Xaml 太陌生了,不知道你的意思 :) 我改成了:但它仍然做同样的事情
  • 老实说,我并不担心等待时间。事实上,我更喜欢它。手头的问题是组合框在单击之前似乎不会填充它的 ItemSource,而不是在代码隐藏中指定的窗口加载
  • 嗯,ComboBox 应该在您设置 ItemSource 后立即填充。您遇到暂停的原因是尚未计算其元素的布局。 VirtualizingStackPanel 所做的只是加载可见元素的布局,所以奇怪的是它不适合你。
【解决方案2】:

您将加载与渲染混淆了。在下面的示例中,get 由 Window_Loaded 调用,而不是由单击 CB 调用。一旦 Window 第一次显示 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;
    }

【讨论】:

  • 当我将 VirtualizingStackPanel 添加到我的测试中时,我得到了亚秒级的渲染(和加载)。 +1 Timis0r。
  • 我不反对这里的任何人。我意识到,并且知道列表在加载时加载到组合框中。如何在呈现所有内容时显示等待光标?
  • 好的,那么您可以将问题从“如何,我可以让它完全加载”更改为绑定到加载的数据。我的经验是您对渲染没有/零编程控制。就像您无法在 XAML 中进行调试一样。不是说我喜欢它,但这似乎是现实。好消息是您应该能够使用虚拟化修复渲染。您可以从后面的代码中显示一个沙漏,但创建集合并不需要时间。我很高兴能够取消渲染对象,就像您可以取消 backgoundworker 操作一样。
猜你喜欢
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多