2012-11-07 32 views
5

Tôi đang tạo trình phát đa phương tiện, bây giờ .. Tôi đã thêm chức năng tìm kiếm thời gian thực để tìm kiếm các bài hát v.v. (Một số điều như tìm kiếm thời gian thực WMP) tức là khi bạn nhập từ khóa tìm kiếm xảy ra.Kiểm soát WPF trên Chủ đề giao diện người dùng riêng biệt?

Trong quá trình tìm kiếm, truy cập cơ sở dữ liệu và tải một IEnumerable được thực hiện trên một luồng khác thông qua BackGroundProcess. Giao diện người dùng được cập nhật bằng cách gọi một điều phối viên của một UIElement.

Quá trình này khá nhanh, tuy nhiên khi bạn nhập từ khóa tìm kiếm vào hộp văn bản, có vẻ như có độ trễ nhỏ, điều này là do việc cập nhật Listbox.ItemSource mất một thời gian. có nghĩa là bạn muốn tìm kiếm "Adele", khi bạn nhập "a", chức năng tìm kiếm sẽ tải kết quả cho "A", nhưng khi chúng tôi nhập toàn bộ từ "Adele", một thời gian để hiển thị " d "" e "" l "" e "và có độ trễ nhỏ giữa các chữ cái này.

Trong quá trình tìm kiếm này, khi tôi ngừng cập nhật giao diện người dùng, quá trình tìm kiếm có vẻ rất trơn tru, điều này chỉ có nghĩa là Listbox đang khóa luồng, vì vậy phần còn lại của giao diện người dùng bị kẹt ở đó. được thực hiện với quá trình xử lý của nó. Vì vậy, tôi tin rằng nếu tôi có thể đặt Điều khiển Listbox đến một chuỗi giao diện người dùng khác, tôi có thể duy trì luồng chảy mượt mà của trình phát không phụ thuộc vào thời gian thực hiện để tải Hộp danh sách. FYI: Data Virutualization là có & ListBox có UI Virtualization đang hoạt động

Làm cách nào để đặt điều khiển ListBox vào một Chủ đề giao diện người dùng khác? WPF, C#

Cảm ơn trước :)

+0

Có hiệu quả bạn không thể ... ít nhất là không có cách nào khả thi mà tôi đã thấy. – Servy

+0

Sử dụng .net 4.5?có một tài sản Delay tốt đẹp trên bindings bây giờ có thể là một chiến thắng dễ dàng cho bạn ở đây, về cơ bản thiết lập nó thành một cái gì đó như 100ms và nó sẽ chỉ cập nhật bindings nếu người dùng ngừng gõ cho khoảng thời gian đó (hoặc nhấn enter hoặc textbox mất tiêu điểm) – Andy

+1

Có một và chỉ một chủ đề giao diện người dùng. –

Trả lời

5

Nếu bạn đang truy vấn cơ sở dữ liệu trên tất cả các phím nhấn - điều này sẽ gây ra cho bạn một số sự chậm chạp khi gõ nhanh (hoặc thậm chí thường)

Bạn sẽ khấm khá hơn throttling yêu cầu, chúng tôi sử dụng để tăng tốc trên chủ đề điều phối.

public static class DispatcherExtensions 
{ 
    private static Dictionary<string, DispatcherTimer> timers = 
     new Dictionary<string, DispatcherTimer>(); 
    private static readonly object syncRoot = new object(); 

    public static string DelayInvoke(this Dispatcher dispatcher, string namedInvocation, 
     Action action, TimeSpan delay, 
     DispatcherPriority priority = DispatcherPriority.Normal) 
    { 
     lock (syncRoot) 
     { 
      if (String.IsNullOrEmpty(namedInvocation)) 
      { 
       namedInvocation = Guid.NewGuid().ToString(); 
      } 
      else 
      { 
       RemoveTimer(namedInvocation); 
      } 
      var timer = new DispatcherTimer(delay, priority, (s, e) => 
       { 
        RemoveTimer(namedInvocation); 
        action(); 
       }, dispatcher); 
      timer.Start(); 
      timers.Add(namedInvocation, timer); 
      return namedInvocation; 
     } 
    } 


    public static void CancelNamedInvocation(this Dispatcher dispatcher, string namedInvocation) 
    { 
     lock (syncRoot) 
     { 
      RemoveTimer(namedInvocation); 
     } 
    } 

    private static void RemoveTimer(string namedInvocation) 
    { 
     if (!timers.ContainsKey(namedInvocation)) return; 
     timers[namedInvocation].Stop(); 
     timers.Remove(namedInvocation); 
    } 


} 

Giả sử bạn không sử dụng MVVM, bạn có thể dễ dàng sử dụng này như vậy trong nút của bạn bấm

Dispatcher.CurrentDispatcher.DelayInvoke("UpdateSearch", 
     YourMethodThatStartsBackgroundThread,Timespan.FromSeconds(1)); 

Cũng đáng lưu ý: f bạn đang sử dụng 4,5 có các Delay sở hữu vào sự liên kết bạn có thể nhìn vào.

+0

Cảm ơn người đàn ông, tôi sẽ kiểm tra điều này ngay bây giờ !! – Xero

+0

Yessss !! Làm việc như một say mê! Đoạn mã rất hữu ích! – Xero

+0

@Xero có thể bạn sẽ được hưởng lợi từ việc xem xét Phản hồi tích cực của Microsoft. (Rx). Rất nhiều hướng dẫn tôi thấy đã chỉ ra cách bạn có thể dễ dàng điều chỉnh các truy vấn. – Thelonias

1

Trong ASP.NET, thường chúng ta sử dụng hai techiniques

  • Chờ tối đa 3 char để bắt đầu tìm kiếm.
  • Đợi một số mili giây sau khi người dùng ngừng nhập và trước khi bắt đầu tìm kiếm, khi người dùng nhập nhanh hơn một vài mili giây, cụm từ tìm kiếm của bạn sẽ chứa nhiều hơn một char. Tùy chọn thứ hai này bao gồm bắt đầu hẹn giờ khi người dùng bắt đầu nhập và đặt bộ hẹn giờ này về 0 (không dừng nó) mỗi lần nhấn. Khi người dùng dừng nhập 2000 mili giây (ví dụ), bạn thực hiện tìm kiếm

Cách tiếp cận hoàn hảo là kết hợp hai techiniques này: Chỉ tìm kiếm nếu bạn có từ 3 ký tự trở lên trong tiêu chí tìm kiếm và sử dụng hẹn giờ.

Các vấn đề liên quan