2011-09-12 35 views
10

Tôi hiện đang cố gắng sử dụng một thành phần WPF sử dụng Application.Current từ một ứng dụng WPF, tuy nhiên do một số lý do tôi không bao giờ gọi Application.Run (cũng không phải là một Tùy chọn). Kết quả là một NullReferenceException.Application.Current "null" trong giao diện điều khiển ứng dụng

Tôi về cơ bản đang cố gắng hiển thị nhiều phiên bản của cùng một cửa sổ WPF từ những gì sẽ là một ứng dụng giao diện điều khiển. Bất kỳ lời khuyên nào (và các mẫu mã trong C#/F #) sẽ được hoan nghênh!

Cảm ơn trước

+0

Nếu bạn không 'Chạy()' một ứng dụng, bạn không có 'Ứng dụng'. Bạn đang làm gì đấy? – SLaks

+1

Aaah, niềm vui khi sử dụng các điều khiển WPF bên ngoài ứng dụng WPF. – Will

+0

Tôi đang cố gắng hiển thị các cửa sổ WPF từ một ứng dụng giao diện điều khiển đa luồng. Các trường hợp của cùng một cửa sổ được hiển thị nhiều lần có thể và sẽ xảy ra, vì vậy tình hình không quá dễ dàng! :/ – em70

Trả lời

15

Chỉ cần để cung cấp một giải pháp thay thế. Có thể giữ một ứng dụng đang chạy mà không có bất kỳ cửa sổ nào đang mở. Đối với tôi điều này cảm thấy ít 'hackish'. :) http://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode.aspx

public class AppCode : Application 
{ 
    // Entry point method 
    [STAThread] 
    public static void Main() 
    { 
     AppCode app = new AppCode(); 
     app.ShutdownMode = ShutdownMode.OnExplicitShutdown; 
     app.Run(); 
     ... 
     app.Shutdown(); 
    } 
} 

EDIT: Ok này có một chút rườm rà. Application.Run sẽ chặn, vì vậy nó cần phải chạy trong thread riêng của nó. Khi nó chạy theo chủ đề riêng của nó, bất kỳ tương tác nào giữa chuỗi chính của bạn và luồng ui của bạn đã được thực hiện tốt nhất bởi Application.Current.Dispatcher.Invoke. Đây là một số mã làm việc, giả định rằng bạn có một lớp kế thừa từ Ứng dụng. Tôi đang sử dụng một App.xaml/App.xaml.cs đã sửa đổi mà một mẫu dự án WPF tạo ra cho bạn, để xử lý miễn phí ResourceDictionaries miễn phí.

public class Program 
{ 
    // Entry point method 
    [STAThread] 
    public static void Main() 
    { 
    var thread = new System.Threading.Thread(CreateApp); 
    thread.SetApartmentState(System.Threading.ApartmentState.STA); 
    thread.Start(); 

    // This is kinda shoddy, but the thread needs some time 
    // before we can invoke anything on the dispatcher 
    System.Threading.Thread.Sleep(100); 

    // In order to get input from the user, display a 
    // dialog and return the result on the dispatcher 
    var result = (int)Application.Current.Dispatcher.Invoke(new Func<int>(() => 
     { 
      var win = new MainWindow(); 
      win.ShowDialog(); 
      return 10; 
     }), null); 

    // Show something to the user without waiting for a result 
    Application.Current.Dispatcher.Invoke(new Action(() => 
    { 
     var win = new MainWindow(); 
     win.ShowDialog(); 
    }), null); 

    System.Console.WriteLine("result" + result); 
    System.Console.ReadLine(); 

    // This doesn't really seem necessary 
    Application.Current.Dispatcher.InvokeShutdown(); 
    } 

    private static void CreateApp() 
    { 
    App app = new App(); 
    app.ShutdownMode = ShutdownMode.OnExplicitShutdown; 
    app.Run(); 
    } 
} 
+0

Cảm ơn, điều này nghe có vẻ tốt, tuy nhiên tôi thực sự đang sử dụng chuỗi điều khiển của cửa sổ ẩn để tạo và hiển thị các cửa sổ khác. Làm thế nào tôi sẽ làm như vậy trong ví dụ của bạn? – em70

+0

@ emaster70 - Đã chỉnh sửa. Nó có một chút cồng kềnh hơn tôi nghĩ ... –

+0

Cảm ơn bạn đã đi theo chiều dài để cung cấp một câu trả lời rõ ràng như vậy! – em70

6

Sau đây là hành vi dự định của lớp Application:

  • Cửa sổ mở đầu tiên là MainWindow.
  • Cửa sổ duy nhất trong danh sách trở thành MainWindow (nếu những người khác là bị xóa).
  • Lớp ứng dụng được thiết kế để thoát nếu không có cửa sổ nào trong danh sách cửa sổ .

Kiểm tra điều này link.

Vì vậy, về cơ bản bạn không thể chạy Ứng dụng mà không có bất kỳ cửa sổ nào đang mở. Giữ cửa sổ mở nhưng ẩn.


Nếu tôi đã hiểu lầm vấn đề của bạn, sau đó có lẽ là trường hợp tương tự sau đây có thể giúp:

+0

Tôi đã kết thúc chạy khi bạn đề xuất một cửa sổ ẩn. Trong bối cảnh của cửa sổ đó, thông qua Dispatcher.Invoke các cuộc gọi, tôi khởi tạo và .Show() các cửa sổ khác. Điều đó nghe có vẻ khá khó chịu nhưng hiện tại nó hoạt động :) – em70

+0

Cũng theo quan điểm của trình biên dịch, chương trình của bạn không có cửa sổ là khó chịu: p – loxxy

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