Bạn không cần BẤT KỲ câu trả lời cầu kỳ nào khác. Dưới đây là một ví dụ đơn giản mà không có tất cả các Margin
, Height
, Width
thuộc tính thiết lập trong XAML, nhưng phải đủ để cho thấy làm thế nào để có được điều này được thực hiện ở mức cơ bản.
XAML
Xây dựng một Window
trang như bình thường và thêm các trường của bạn vào đó, nói a Label
và TextBox
điều khiển bên trong StackPanel
:
<StackPanel Orientation="Horizontal">
<Label Name="lblUser" Content="User Name:" />
<TextBox Name="txtUser" />
</StackPanel>
Sau đó, tạo tiêu chuẩn Button
cho Gửi ("OK" hoặc "Gửi") và nút "Hủy" nếu bạn muốn:
<StackPanel Orientation="Horizontal">
<Button Name="btnSubmit" Click="btnSubmit_Click" Content="Submit" />
<Button Name="btnCancel" Click="btnCancel_Click" Content="Cancel" />
</StackPanel>
Code-Behind
Bạn sẽ thêm các Click
hàm xử lý sự kiện trong đoạn mã phía sau, nhưng khi bạn đến đó, trước tiên, hãy khai báo một biến công khai nơi bạn sẽ lưu trữ giá trị hộp văn bản của mình:
public static string strUserName = String.Empty;
Sau đó, đối với các chức năng xử lý sự kiện (nhấp chuột phải vào Click
chức năng trên nút XAML, chọn "Go To Definition", nó sẽ tạo cho bạn), bạn cần kiểm tra xem hộp của bạn có trống không. Bạn lưu trữ nó trong biến nếu không, và đóng cửa sổ của bạn:
private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
if (!String.IsNullOrEmpty(txtUser.Text))
{
strUserName = txtUser.Text;
this.Close();
}
else
MessageBox.Show("Must provide a user name in the textbox.");
}
Gọi nó từ một trang khác
Bạn đang nghĩ, nếu tôi đóng cửa sổ của tôi với cái this.Close()
đó ở đó, giá trị của tôi sẽ biến mất, phải không? KHÔNG!! Tôi tìm thấy điều này từ một trang web khác: http://www.dreamincode.net/forums/topic/359208-wpf-how-to-make-simple-popup-window-for-input/
Họ đã có một ví dụ tương tự như thế này (tôi đã làm sạch nó một chút) về cách mở của bạn Window
từ người khác và truy xuất các giá trị:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnOpenPopup_Click(object sender, RoutedEventArgs e)
{
MyPopupWindow popup = new MyPopupWindow(); // this is the class of your other page
//ShowDialog means you can't focus the parent window, only the popup
popup.ShowDialog(); //execution will block here in this method until the popup closes
string result = popup.strUserName;
UserNameTextBlock.Text = result; // should show what was input on the other page
}
}
Nút Hủy
Bạn đang nghĩ, còn nút Hủy đó thì sao? Vì vậy, chúng tôi chỉ cần thêm một biến công khai khác trở lại trong mã cửa sổ bật lên của chúng tôi phía sau:
public static bool cancelled = false;
Và hãy bao gồm btnCancel_Click
trình xử lý sự kiện của chúng tôi và thực hiện một thay đổi đối với btnSubmit_Click
:
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
cancelled = true;
strUserName = String.Empty;
this.Close();
}
private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
if (!String.IsNullOrEmpty(txtUser.Text))
{
strUserName = txtUser.Text;
cancelled = false; // <-- I add this in here, just in case
this.Close();
}
else
MessageBox.Show("Must provide a user name in the textbox.");
}
Và sau đó chúng tôi chỉ đọc biến đó trong MainWindow
btnOpenPopup_Click
sự kiện của chúng tôi :
private void btnOpenPopup_Click(object sender, RoutedEventArgs e)
{
MyPopupWindow popup = new MyPopupWindow(); // this is the class of your other page
//ShowDialog means you can't focus the parent window, only the popup
popup.ShowDialog(); //execution will block here in this method until the popup closes
// **Here we find out if we cancelled or not**
if (popup.cancelled == true)
return;
else
{
string result = popup.strUserName;
UserNameTextBlock.Text = result; // should show what was input on the other page
}
}
Phản hồi dài, nhưng tôi muốn cho thấy điều này dễ dàng như thế nào bằng cách sử dụng public static
các biến. Không DialogResult
, không có giá trị trả về, không có gì. Chỉ cần mở cửa sổ, lưu trữ các giá trị của bạn với các sự kiện nút trong cửa sổ bật lên, sau đó truy xuất chúng sau đó trong chức năng cửa sổ chính.