需要有关如何在单击对象时构建弹出窗体的建议

时间:2011-12-23 23:14:16

标签: c# .net wpf xaml popup

基本上我有三个空插槽。

这三个位代表游戏的三个选定项目。

当我点击其中一个空框时,我想显示这个弹出框,其中包含所有项目和一些复选框的集合,用户可以选择某些过滤器并过滤掉项目。

构建这样的“窗口”对我来说并不难,我弄清楚窗口应该如何与主窗口相关存在。

我应该将这个新弹出窗口放在新的Window中并在用户点击时显示,然后点击该项目,将所选项目发送回主窗口事件吗?

你会怎么做?我对WPF不熟悉并希望得到一些反馈。

3 个答案:

答案 0 :(得分:2)

您可以使用流程设计而不是弹出窗口。


屏幕1
Screen1
用户单击其中一个插槽以查看更多信息或为该插槽添加过滤器选项。单击插槽可打开Screen2。


屏幕2
Screen2
在该屏幕中,用户可以过滤他想要的项目。主动插槽(正在编辑的插槽)在左侧突出显示。还可以显示有关所选项目的更多信息。在应用和取消(后退)按钮的底部。如果用户取消而未保存/应用,则可以显示提示。

您可以应用WPF StylesAnimations,以使您的应用程序更具视觉吸引力。

答案 1 :(得分:0)

您可以做的是打开另一个窗口作为新表单,并使用方法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
}

答案 2 :(得分:0)

假设您已经使用“弹出窗口”标记了此问题,则需要一个对话框,您可以在框中为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设置为true。我通常只为你想要返回的按钮添加OnClick事件,并关闭以下内容:

this.DialogResult = true;

有关自定义对话框表单的详细信息,请参阅:Custom Dialog Boxes

使用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