2009-02-03 37 views
34

Làm cách nào để nhận được System.Windows.ShowDialog() để trả về 'true'?Làm cách nào để lấy System.Windows.ShowDialog() để trả về 'true'?

Tôi hơi mới mẻ với điều này. Loại trả về của System.Windows.ShowDialogbool? Nó được cho là trả lại true khi bạn nhấn Submitfalse khi bạn nhấn Cancel. Nhưng tôi không chắc chắn làm thế nào để chỉ định mà Button là nút gửi chính thức.

EDIT: Trên ghi chú có liên quan, tôi tò mò về cách nó có thể trả về giá trị rỗng.

Trả lời

36

http://msdn.microsoft.com/en-us/library/system.windows.window.showdialog.aspx

ShowDialog trả về một Nullable < (Tất < (T>)>) Boolean giá trị mà xác định liệu hoạt động được chấp nhận hoặc hủy. Giá trị trả về là giá trị của thuộc tính DialogResult trước khi đóng cửa sổ (xem DialogResult).

Về cơ bản, bạn quyết định bằng cách đặt giá trị của DialogResult, không phải bằng cách nhấn một nút cụ thể - bạn quyết định nút nào.

+0

Lời xin lỗi của tôi nếu điều này là thừa hoặc quá rõ ràng, nhưng bạn nên đặt bool? Giá trị DialogResult trước khi bạn gọi phương thức Close() bên trong hộp thoại. Không làm như vậy sẽ dẫn đến một InvalidOperationException được ném, với các Exception.Message bất động sản được thiết lập để "DialogResult có thể được thiết lập chỉ sau khi cửa sổ được tạo ra và hiển thị như hộp thoại." – ClockEndGooner

+0

Bạn sẽ phải tha thứ cho tôi nếu tôi đã sai, vì đã nhiều năm kể từ khi tôi làm WinForms, nhưng tôi nghĩ, có, bạn sẽ thiết lập DialogResult _ (ví dụ, bên trong trình xử lý OnClick của Button, nhưng nó có thể là bất kỳ cơ chế nào bạn mơ ước) _, và sau đó gọi Close() – JMD

14

Trong WPF, đặt thuộc tính Button.IsDefault thành true để chỉ định rằng nút là nút "gửi" cho cửa sổ. Tôi không chắc chắn 100% rằng điều này sẽ làm cho cửa sổ gần gũi với một DialogResult của sự thật. Nếu không, bạn chỉ cần để xử lý sự kiện Click của nó thusly:

this.DialogResult = true; 

Sửa

Tương tự như vậy, bạn có thể sử dụng Button.IsCancel tài sản để có một nút là nút "hủy" cho một hình thức.

Chỉnh sửa 2

Tôi tin rằng lý do ShowDialog là nullable là vì nó vô cho đến khi mẫu được gửi hoặc hủy bỏ, bạn có thể kiểm tra cho rằng nếu bạn đang quan sát hộp thoại trong một thread nền. Tôi đã không thử điều đó, nhưng nó có vẻ giống như một lý do hợp lý tại sao họ sẽ giới thiệu một trạng thái "không rõ" thứ ba (null) cho tài sản.

+4

Không, thiết lập IsDefault là true sẽ không gây ra một nút bấm để đóng hộp thoại, tuy nhiên, IsCancel sẽ thiết lập DialogResult sẽ đóng hộp thoại. Mặc định là true làm cho lệnh được kích hoạt nếu người dùng nhấn phím Enter –

6

nếu bạn thiết lập DialogResult true ShowDialog trả về true, nếu bạn thiết lập DialogResult false ShowDialog trả về false nếu hộp thoại được đóng lại mà không cần thiết lập DialogResult (người dùng nhấp vào dấu X màu đỏ ở góc trên cùng bên phải) ShowDialog sẽ trả về null.

Đặt IsDefault thành true sẽ khiến nút trông hơi khác và nhấn enter sẽ "nhấp" nút này.

Nếu bạn đặt IsCancel thành true thì nhấn esc sẽ "nhấp" nút này.

+0

Khi nhấp vào X, ShowDialog sẽ trả về false, không null. Tôi tin rằng nó chỉ trả về null, nếu có điều gì đó sai (nếu có). –

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