Muszę utworzyć okno dialogowe / monit zawierające pole tekstowe do wprowadzania danych przez użytkownika. Mój problem polega na tym, jak uzyskać tekst po potwierdzeniu dialogu? Zwykle tworzyłbym dla tego klasę, która zapisywałaby tekst we właściwości. Jednak chcę zaprojektować okno dialogowe przy użyciu XAML. Musiałbym więc w jakiś sposób rozszerzyć kod XAML, aby zapisać zawartość TextBox we właściwości - ale myślę, że nie jest to możliwe w przypadku czystego XAML. Jaki byłby najlepszy sposób na zrealizowanie tego, co chciałbym zrobić? Jak zbudować okno dialogowe, które można zdefiniować z XAML, ale nadal może w jakiś sposób zwrócić dane wejściowe? Dzięki za podpowiedź!
84
Po prostu dodaję metodę statyczną, aby nazwać ją jak MessageBox:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x:Class="utils.PromptDialog" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" WindowStartupLocation="CenterScreen" SizeToContent="WidthAndHeight" MinWidth="300" MinHeight="100" WindowStyle="SingleBorderWindow" ResizeMode="CanMinimize"> <StackPanel Margin="5"> <TextBlock Name="txtQuestion" Margin="5"/> <TextBox Name="txtResponse" Margin="5"/> <PasswordBox Name="txtPasswordResponse" /> <StackPanel Orientation="Horizontal" Margin="5" HorizontalAlignment="Right"> <Button Content="_Ok" IsDefault="True" Margin="5" Name="btnOk" Click="btnOk_Click" /> <Button Content="_Cancel" IsCancel="True" Margin="5" Name="btnCancel" Click="btnCancel_Click" /> </StackPanel> </StackPanel> </Window>
A kod za:
Więc możesz to nazwać tak:
źródło
MessageBox
statycznej metody w stylu a . Zwięzły kod wielokrotnego użytku!Świetna odpowiedź Josha, cała zasługa jego, jednak nieznacznie zmodyfikowałem ją do tego:
MyDialog Xaml
<StackPanel Margin="5,5,5,5"> <TextBlock Name="TitleTextBox" Margin="0,0,0,10" /> <TextBox Name="InputTextBox" Padding="3,3,3,3" /> <Grid Margin="0,10,0,0"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Button Name="BtnOk" Content="OK" Grid.Column="0" Margin="0,0,5,0" Padding="8" Click="BtnOk_Click" /> <Button Name="BtnCancel" Content="Cancel" Grid.Column="1" Margin="5,0,0,0" Padding="8" Click="BtnCancel_Click" /> </Grid> </StackPanel>
Kod MyDialog za
I nazwij to gdzie indziej
źródło
WindowStyle="ToolWindow"
w oknie sprawia, że wygląda jeszcze ładniej. RównieżWindowStartupLocation="CenterOwner"
idialog.Owner = this;
umieszcza go na środku okna nadrzędnegoNie potrzebujesz ŻADNEJ z tych innych wymyślnych odpowiedzi. Poniżej znajduje się uproszczony przykład, który nie ma wszystkich
Margin
,Height
,Width
właściwości określone w XAML, ale powinien być wystarczający, aby pokazać, w jaki sposób, aby to zrobić na poziomie podstawowym.XAML
Zbuduj
Window
stronę tak jak zwykle i dodaj do niej swoje pola, powiedz aLabel
iTextBox
kontroluj wewnątrz aStackPanel
:<StackPanel Orientation="Horizontal"> <Label Name="lblUser" Content="User Name:" /> <TextBox Name="txtUser" /> </StackPanel>
Następnie utwórz standard
Button
przesyłania („OK” lub „Prześlij”) i przycisk „Anuluj”, jeśli chcesz:<StackPanel Orientation="Horizontal"> <Button Name="btnSubmit" Click="btnSubmit_Click" Content="Submit" /> <Button Name="btnCancel" Click="btnCancel_Click" Content="Cancel" /> </StackPanel>
Code-Behind
Będziesz dodać
Click
funkcje obsługi zdarzeń w kodzie opóźnieniem, ale kiedy tam najpierw zadeklarować zmienną publiczną, gdzie można przechowywać swoją wartość pola tekstowego:Następnie dla funkcji obsługi zdarzeń (kliknij prawym przyciskiem myszy
Click
funkcję na przycisku XAML, wybierz „Przejdź do definicji”, utworzy ją za Ciebie), musisz sprawdzić, czy twoje pole jest puste. Przechowujesz go w swojej zmiennej, jeśli tak nie jest, i zamknij okno:Wywołanie tego z innej strony
Myślisz, że jeśli zamknę okno z tym
this.Close()
, moja wartość zniknie, prawda? NIE!! Dowiedziałem się tego z innej strony: http://www.dreamincode.net/forums/topic/359208-wpf-how-to-make-simple-popup-window-for-input/Mieli podobny przykład do tego (trochę go wyczyściłem), jak otworzyć twój
Window
z innego i pobrać wartości:Przycisk Anuluj Zastanawiasz
się, a co z tym przyciskiem Anuluj? Więc po prostu dodajemy kolejną zmienną publiczną z powrotem w naszym kodzie wyskakującego okna:
Dołączmy nasz
btnCancel_Click
program obsługi zdarzeń i wprowadźmy jedną zmianę wbtnSubmit_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."); }
A potem właśnie odczytaliśmy tę zmienną w naszym
MainWindow
btnOpenPopup_Click
zdarzeniu:Długa odpowiedź, ale chciałem pokazać, jakie to łatwe przy użyciu
public static
zmiennych. NieDialogResult
, żadnych wartości zwracanych, nic. Po prostu otwórz okno, zapisz wartości za pomocą przycisków zdarzeń w wyskakującym oknie, a następnie pobierz je w funkcji okna głównego.źródło
DialogResult
w WPF, toMessageBoxResult
, co znalazłem działa tylko ze standardowych przycisków naMessageBox.Show()
oknie - nie jednego z niestandardowego okna dialogowego przedstawionego przez.ShowDialog()
- a może tylko zapytania dla standardowych operatorówMessageBoxResult.OK
,MessageBoxResult.Cancel
„Tak” , „Nie” itp. - nie wartości logiczne ani niestandardowe. 3) iIsCancel
tak wymagałoby przechowywania go w wartości logicznej i odesłania go z powrotem, więc było to uniwersalne rozwiązanie.