2012-04-12 29 views
8

Nếu người dùng đóng Ứng dụng, một Tệp tin Lưu-Tệp phải được hiển thị (để chắc chắn rằng anh ta muốn loại bỏ các thay đổi của các tệp đã chỉnh sửa).ShowDialog trong Sự kiện đóng

để thực hiện điều này, tôi có một menuitem với một lệnh ràng buộc (không có key-gesture):

private void Command_Exit(object sender, ExecutedRoutedEventArgs e) 
{ 
    Application.Current.Shutdown(); 
} 

các MainWindow có một kết thúc sự kiện. trong sự kiện này, tôi kiểm tra xem có tệp chưa được lưu hay không. nếu có, savedialog phải được mở (để lựa chọn, trong đó các file phải được lưu):

private void Window_Closing(object sender, CancelEventArgs e) 
    { 
     if (sdl.Count() > 0) 
     { 
      SaveDialog sd = new SaveDialog(); 
      IEnumerable<Doc> close = sd.ShowDialog(this); 
      if (close == null) 
       e.Cancel = true; 
      else 
       foreach (Doc document in close) 
        document.Save(); 
     } 

    } 

trong này ShowDialog-Phương (thực hiện trong tôi SaveDialog-Class) tôi gọi

bool? ret = ShowDialog(); 
if (!ret.HasValue) 
    return null; 
if (!ret.Value) 
    return null; 

Vấn đề là:

Nếu tôi sử dụng phím tắt Alt + F4 để đóng ứng dụng (hành vi mặc định của mainwindow) nó hoạt động và tôi nhận được lưu trữ nếu có tệp chưa được lưu. nhưng nếu tôi đóng ứng dụng bằng cách thực hiện Command_Exit-Method, Method-Call

bool? ret = ShowDialog(); 

trả về null và hộp thoại không xuất hiện.

Nếu tôi gán Alt + F4 KeyGesture cho CommandBinding, sự cố được chuyển đổi: Thực thi Command_Exit hoạt động tốt nhưng phím tắt Alt + F4 thì không.

Lý do mà phương thức ShowDialog() hoạt động không có trong cả hai trường hợp và cách khắc phục?

+0

Có thể đóng cửa sổ theo cách nào? Không chỉ tương tác. – Jodrell

Trả lời

6

Tuyến Application.Current.Shutdown cho phép bạn lắng nghe yêu cầu tắt máy bằng cách xử lý sự kiện Exit như trình bày chi tiết ở đây:

http://msdn.microsoft.com/en-us/library/ms597013.aspx

Nó không chi tiết như thế nào nó đóng cửa sổ, vì vậy tôi sẽ không nhất thiết phải tin rằng xử lý sự kiện đóng sẽ cháy trước khi nó đóng ứng dụng.

Cách tiêu chuẩn khác để tắt ứng dụng là đóng cửa sổ chính (cửa sổ được hiển thị ngay từ đầu). Đây có thể là phương pháp Window.Close, nếu bạn đang ở trong ngữ cảnh của cửa sổ, chỉ cần gọi Close(). Điều này sau đó sẽ nhấn xử lý sự kiện đóng cửa.

+0

aah, tất nhiên, tại sao tôi không nghĩ đơn giản gọi Close()? Cảm ơn, Đã giải quyết sự cố – 0xDEADBEEF

+0

Đóng là cách tiêu chuẩn.Khi biểu mẫu chính đóng, mã sẽ tự động tiến tới điểm vào nơi nó sẽ thoát. Các hoạt động bên trong WPF sau đó sẽ tắt bất kỳ phần còn lại nào của ứng dụng. –

3

Việc triển khai Command_Exit của bạn sai. Application.Current.Shutdown() có nghĩa là ứng dụng đã tắt, điều này có thể ngăn các hộp thoại mở.

Bạn nên thực hiện lệnh theo cách khác: trong lệnh, bạn nên hỏi logic nghiệp vụ của mình nếu nó an toàn để tắt máy và chỉ phát hành Application.Current.Shutdown() trong trường hợp đó. Nếu không, bạn nên yêu cầu logic nghiệp vụ bắt đầu trình tự tắt, do đó sẽ lưu các tệp đang mở và phát hành Shutdown sau khi hoàn thành các thao tác lưu.

Hơn nữa, bạn nên kích hoạt thói quen tương tự khi người dùng cố gắng đóng cửa sổ chính (nghĩa là, trên số Window.Closing).

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