2012-03-14 31 views
1

當在WPF窗口中綁定組合框時,我遇到了一個奇怪的問題。如何在等待組合框渲染時顯示waitcursor?

我正在加載一個List對象,通過它的.ItemsSource在Window Load上填充組合框,但是它不會填充。

至少,直到點擊箭頭。一旦點擊箭頭,窗口就會凍結,一分鐘左右後,會顯示4000多條記錄。

現在,列表被加載,但是,當我單擊組合框時需要一段時間才能呈現,那麼如何在呈現列表時顯示一個waitcursor?

這裏的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 
+0

只需將代碼從「組合框點擊」事件移動到「表單加載」事件。您在此處提供的代碼用於將項目添加到列表中而不是組合框。 – Himal 2012-03-14 13:54:11

+0

對不起,忘了提及這一點,除非使用多線程,否則加載應用程序還需要一段時間。 – Himal 2012-03-14 14:01:00

+0

請重新閱讀我發佈的代碼。該組合框由填充數據的函數填充,並且在組合框單擊事件中根本沒有任何東西。 – Kevin 2012-03-14 14:09:12

回答

3

我不知道是否有一個更好的辦法,不過......

如果您想在第一次打開ComboBox時避免等待它有很多項目,則可以將ComboBox.IsDropDownOpen設置爲True並返回False

編輯: 有點研究出現了VirtualizingStackPanel。基本上,你的XAML看起來就像這樣:

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

我能夠即時查看ComboBox與40K號。

+0

我真正想要做的就是隻有'WaitCursor'和_LA顯示,直到組合框完全填充。換句話說,我不希望該窗口可用於操作,直到該組合框被完全加載。這樣,單擊組合框就沒有時間了。 – Kevin 2012-03-14 14:06:42

+0

我的編輯有沒有機會完全消除這種類型的等待時間? – Timiz0r 2012-03-14 14:16:41

+0

對不起,我太新了Xaml知道你的意思:)我改變了它: 但它仍然做同樣的事情 – Kevin 2012-03-14 14:21:40

1

您在渲染時加載時感到困惑。在下面的例子中,get被Window_Loaded調用,而不是通過點擊CB。一旦窗口第一次顯示cb對象已經有了它的數據 - 下拉菜單就不會以默認狀態呈現。只要獲得ComboBox預渲染,只是沒有意義,因爲組合框的默認狀態只是單行。指定1的SelectedIndex,你會看到寡婦第一次顯示時的值 - 證明組合框已經有了它的數據。

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

當我添加VirtualizingStackPanel到我的測試時,我得到了第二個渲染(和加載)。 +1 Timis0r。 – Paparazzi 2012-03-14 15:35:28

+0

我不同意這裏的任何人。我意識到,並且知道該列表在加載時被加載到組合框中。如何在渲染所有內容時顯示一個waitcursor? – Kevin 2012-03-14 15:40:13

+0

好吧,那麼你可能會改變從「如何,我可以得到它完全加載」的問題,因爲我會調用綁定到加載的數據。我的經驗是,您對渲染沒有/零編程控制。就像你無法在XAML中進行調試一樣。不是說我喜歡它,但這似乎是現實。好消息是,您應該能夠通過虛擬化修復渲染。您可以從後面的代碼中顯示小時玻璃,但創建集合不是花時間。我會很高興能夠取消渲染對象,就像您可以取消背景渲染器操作一樣。 – Paparazzi 2012-03-14 16:05:11