Мне нужно создать диалоговое окно / приглашение, включая текстовое поле для ввода пользователем. Моя проблема в том, как получить текст после подтверждения диалога? Обычно я делал для этого класс, который сохранял бы текст в свойстве. Однако я хочу создать диалог с использованием XAML. Поэтому мне как-то пришлось бы расширить код XAML, чтобы сохранить содержимое TextBox в свойстве, но я думаю, что это невозможно с чистым XAML. Как лучше всего понять, чем я хочу заниматься? Как создать диалог, который может быть определен из XAML, но может каким-то образом возвращать ввод? Спасибо за подсказку!
84
Я просто добавляю статический метод, чтобы вызвать его как 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>
И код позади:
Вы можете назвать это так:
источник
MessageBox
статического метода в стиле. Краткий, многоразовый код!Отличный ответ Джоша, вся его заслуга, однако я немного изменил его:
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>
Код MyDialog позади
И назовите это где-нибудь еще
источник
WindowStyle="ToolWindow"
окна делает его еще красивее. ТакжеWindowStartupLocation="CenterOwner"
иdialog.Owner = this;
позиционирует его в центре родительского окнаВам не нужны никакие другие причудливые ответы. Ниже приведен упрощенный пример , который не имеет все
Margin
,Height
,Width
свойства , установленные в XAML, но должно быть достаточно , чтобы показать , как получить это сделано на базовом уровне.XAML
Создайте
Window
страницу, как обычно, и добавьте к ней свои поля, скажем,Label
иTextBox
элемент управления внутриStackPanel
:<StackPanel Orientation="Horizontal"> <Label Name="lblUser" Content="User Name:" /> <TextBox Name="txtUser" /> </StackPanel>
Затем создайте стандарт
Button
для отправки («ОК» или «Отправить») и кнопку «Отменить», если хотите:<StackPanel Orientation="Horizontal"> <Button Name="btnSubmit" Click="btnSubmit_Click" Content="Submit" /> <Button Name="btnCancel" Click="btnCancel_Click" Content="Cancel" /> </StackPanel>
Code-Behind
Вы добавите
Click
функции обработчика событий в код программной части, но когда вы перейдете туда, сначала объявите общедоступную переменную, в которой вы будете хранить значение вашего текстового поля:Затем для функций обработчика событий (щелкните правой кнопкой мыши
Click
функцию на кнопке XAML, выберите «Перейти к определению», он создаст его для вас) вам потребуется проверить, пуст ли ваше поле. Вы сохраняете его в своей переменной, если это не так, и закрываете окно:Вызов его с другой страницы
Вы думаете, что если я закрою окно с этим
this.Close()
там, моя ценность исчезнет, верно? НЕТ !! Я узнал об этом с другого сайта: http://www.dreamincode.net/forums/topic/359208-wpf-how-to-make-simple-popup-window-for-input/У них был аналогичный пример (я его немного очистил) того, как открыть ваш
Window
от другого и получить значения:Кнопка отмены.
Вы думаете, а что насчет кнопки отмены? Поэтому мы просто добавляем еще одну общедоступную переменную обратно в наш код всплывающего окна:
И давайте включим наш
btnCancel_Click
обработчик событий и внесем одно изменение вbtnSubmit_Click
:А затем мы просто читаем эту переменную в нашем
MainWindow
btnOpenPopup_Click
событии:Длинный ответ, но я хотел показать, насколько просто использовать
public static
переменные. НетDialogResult
, никаких возвращаемых значений, ничего. Просто откройте окно, сохраните свои значения с помощью событий кнопок во всплывающем окне, а затем извлеките их в функции главного окна.источник
DialogResult
в WPF, этоMessageBoxResult
, что я нашел работает только от стандартных кнопок наMessageBox.Show()
диалог - не один из диалогового окна пользовательского показанного через.ShowDialog()
- и может только запрос для стандартных операторовMessageBoxResult.OK
,MessageBoxResult.Cancel
«Да» , «Нет» и т. Д. - не логические или пользовательские значения. 3)IsCancel
потребовалось бы сохранить его в логическом значении и отправить обратно, так что это было универсальное решение.