Нужны предложения о том, как создать всплывающую форму при нажатии на объект - PullRequest
1 голос
/ 24 декабря 2011

Обычно у меня есть три пустых слота.

Эти три слота представляют три выбранных элемента игры.

Когда я щелкаю один из пустых полей, я хочу отобразить это всплывающее окнос коллекцией всех элементов и некоторыми флажками, где пользователи могут выбирать определенные фильтры и элементы отфильтровывать.

Построение такого «окна» не сложно для меня, что мне трудно понять, так этокак должно существовать окно по отношению к основному окну.

Должен ли я поместить это новое всплывающее окно в новое Window и отобразить его, когда пользователь щелкает, затем, щелкая элемент, отправляет выбранный элементвернуться к главному событию Window?

Как бы вы это сделали?Я новичок в WPF и буду признателен за отзывы.

Ответы [ 3 ]

2 голосов
/ 24 декабря 2011

Вместо всплывающего окна вы можете иметь дизайн потока.


Экран 1
Screen1
Пользователь нажимает на один из слотов, чтобы просмотреть дополнительную информацию или добавить параметры фильтра для этого слота. При нажатии на слот открывается Screen2.


Экран 2
Screen2
На этом экране пользователь может фильтровать элементы, которые он хочет. Активный слот (редактируемый слот) подсвечивается слева. Более подробная информация о выбранном элементе также может быть отображена. Внизу у кнопок «Применить» и «Отмена» (назад). Подсказка может отображаться в случае отмены пользователем без сохранения / применения.

Вы можете применять WPF Стили и Анимации , чтобы сделать ваше приложение более визуально привлекательным.

0 голосов
/ 24 декабря 2011

Предполагая, что, поскольку вы пометили этот вопрос "всплывающим окном", вам нужно диалоговое окно, вы можете создать обработчики событий для события click в полях примерно так:

private void On_BoxClicked(sender object, EventArgs e)
{
     PopUpBox dialog = new PopUpBox();
     var result = PopUpBox.ShowDialog();
     if (result == true)
     {
          //process the result here accessing the properties that
          //are needed through the dialog object.
     }
}

Вам нужно будет установить DialogResult, чтобы форма была истинной. Обычно я просто добавляю к событию OnClick кнопку, которую вы хотите вернуть как успешную, и закрывайте следующее:

this.DialogResult = true;

Для получения дополнительной информации о пользовательских диалоговых формах см .: Пользовательские диалоговые окна

Использование RoutedCommands

Более сложный подход - добавить в форму команду с параметром для каждого поля. Код для фактической обработки от добавления элементов будет более или менее одинаковым, но он добавляет определенные функции (например, отключение события click, если не выполнены определенные условия - определенные в методе CanExecute):

//the custom command
public static RoutedCommand AddToBox = new RoutedCommand();

//add the can execute method
private void AddToBox_CanExecute(sender object, CanExecuteRoutedEventArgs e)
{
    //assuming that this can always execute
    e.CanExecute = true;
}

//Executing the command when the button is clicked
//Show the dialog box and get the response
private void AddToBox_Executed(sender object, ExecutedRoutedEventArgs e)
{
     PopUpBox dialog = new PopUpBox();
     var result = dialog.ShowDialog();
     if (result == true)
     {
          string box = e.Parameter;      

          //get the result of the dialog where GetResult() is the
          //method that returns the necessary information.
          //here set to object for the sake of example
          object[] obj = dialog.GetResult()

          switch (box)
          {
               case "box1":
                    //put value into box 1
               case "box2":
                    //put value into box 2
               case "box3":
                    //put value into box 3
          }
     }
}

Чтобы использовать команду, добавьте ссылку на команду. Сначала вам нужно будет добавить ссылку на пространство имен, предполагая, что эта команда содержится в Example.Window1:

<Window ...
     xmlns:cmd="clr:NameSpace:Example" ... />

Затем добавьте привязку команды

<Window.CommandBindings>
     <CommandBinding Command="{x:Static cmd:Window1.AddToBox}" 
          CanExecute="AddToBox_CanExecute" Executed="AddToBox_Executed" />
</Window.CommandBindings>

Наконец, добавьте команду и параметр в XAML, например:

<Button Name="Box1" 
      Command="{x:Static cmd:Window1.AddToBox}" 
      CommandParameter="Box1" />

Для получения дополнительной информации о пользовательских маршрутизируемых командах в WPF см .: RoutedCommand Class

0 голосов
/ 24 декабря 2011

Что вы можете сделать, это открыть другое окно в качестве новой формы и использовать метод ShowDialog() вместо Show(). Таким образом, вы сможете использовать DialogResult вашего окна, чтобы узнать, отменил ли пользователь элемент или выбрал его, и вы можете создать метод в этом окне, чтобы получить необходимое значение.

frmList frmPopup = new frmList();
DialogResult response = frmPopup.ShowDialog();  //Execution of this method stops until you close frmPopup

if(response == DialogResult.Ok)                 //Make sure you set the DialogResult value in your form when you are closing correctly
{
    frmPopup.getValue();                        //Method of the window that would return the value you're looking for
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...