Tôi đang chuyển dự án từ WinForms sang WPF. Khi mã của tôi dựa trên WinForms tôi đã sử dụng (this.InvokeRequired) để kiểm tra xem luồng có truy cập hay không. Bây giờ tôi sử dụng đoạn mã sau dựa trên Mainform của tôi:Sự cố với quyền truy cập giao diện người dùng từ Nhân viên nền
// this is the delegate declaration to Allow Background worker thread to write to Log Output
delegate void LogUpdateCallBack(String LogMessage);
// method to update the Log Window from the Background Thread
public void LogUpdate(String LogMessage)
{
Console.WriteLine("Entering");
if (!Application.Current.Dispatcher.CheckAccess())
{
Console.WriteLine("Thread doesn't have UI access");
LogUpdateCallBack callback = new LogUpdateCallBack(LogUpdate);
Application.Current.Dispatcher.Invoke(callback, LogMessage);
}
else
{
Console.WriteLine("Thread has UI access");
listBox_Output.Items.Add(LogMessage);
Console.WriteLine(LogMessage);
// listBox_Output.TopIndex = listBox_Output.Items.Count - 1;
}
Console.WriteLine("Exiting");
}
Vấn đề tôi gặp phải là Listbox không cập nhật. Không có lỗi hoặc ngoại lệ, tôi đã thử cập nhật các điều khiển giao diện người dùng khác. LogMessage đang viết vào cửa sổ Output, vì vậy tôi đang stumped.
Dưới đây là đầu ra điều khiển mẫu:
Entering
Thread doesn't have UI access
Entering
Thread has UI access
My LogMessage is output here
Exiting
Exiting
Entering
Thread doesn't have UI access
Entering
Thread has UI access
My LogMessage is output here
Exiting
Exiting
Tôi đã cố gắng cập nhật giao diện điều khiển khác chỉ để kiểm tra xem nó là một vấn đề với Listbox của tôi, nhưng không có may mắn.
Ngoài chuyển đổi sang CheckAccess(), thay đổi lớn khác mà tôi đã thực hiện trong mã WPF mới là căn cứ tất cả mã đang chạy trong công nhân nền trong lớp khác .. Tôi không chắc liệu điều này có thể là một phần của vấn đề?
-
tôi đã cố gắng ý tưởng của bạn:
Application.Current.Dispatcher.BeginInvoke(new LogUpdateCallBack(LogUpdate), LogMessage)
Tuy nhiên Listbox của tôi vẫn không được cập nhật, nếu tôi ra
Console.WriteLine(listBox_Output);
tôi xem danh sách mảng hộp phát triển:
System.Windows.Controls.ListBox Items.Count:2020
System.Windows.Controls.ListBox Items.Count:2021
System.Windows.Controls.ListBox Items.Count:2022
System.Windows.Controls.ListBox Items.Count:2023
System.Windows.Controls.ListBox Items.Count:2024
System.Windows.Controls.ListBox Items.Count:2025
Nhưng không có thay đổi trong biểu mẫu. Điều này rất khó hiểu!
Bất kỳ liên kết dữ liệu trên Listbox ? Có một Items.Add ("test") từ sự kiện Page_Load không? –
Không có DataBinding .. Tôi đang cập nhật ListBox từ các khu vực khác của mã của tôi mà không gặp khó khăn gì. Tôi cũng đã cố gắng cập nhật điều khiển giao diện người dùng khác trong trường hợp nó đã xuống đến vấn đề Listbox .. không có may mắn. – mrbencowell
Một điều kỳ lạ nữa cần lưu ý .. là nếu tôi xuất listBox_Output trong Console tôi có thể thấy các mục đang được thêm vào (nó báo cáo số mục), vì vậy có vẻ như các mục của tôi đang được thêm vào, tuy nhiên giao diện người dùng không được được cập nhật. Tôi đã thử listBox_Output.InvalidateVisual(); không có hiệu lực. – mrbencowell