根据来自不同窗口

时间:2017-06-11 12:54:53

标签: c# wpf button

我目前正在尝试制作类似电影院的预订应用。我在处理预订时遇到了一些问题,因为我创建了一个5x5网格的按钮,这些按钮调用了一个单独的窗口。在该窗口中,您可以输入要查看的名称和电影。之后,按钮应以不同颜色着色,以表明此地点已被保留。

我能够生成按钮,每个按钮都会调用一个新窗口。但是,我似乎无法弄清楚如何将名称和电影信息传回按钮进行配置。另外,我创建它们的方式并不是我所有按钮的颜色,因为它们基本上都是"相同"宾语?非常感谢任何帮助。

代码Buttongrid:

public partial class Filmgrid : Window
{
    public Filmgrid()
    {
        InitializeComponent();

        int width = 5;
        int height = 5;

        for (int i = 0; i < width; i++)
        {
            var rowDefinition = new RowDefinition();
            grid.RowDefinitions.Add(rowDefinition);
        }

        for (int y = 0; y < height; y++)
        {
            var columnDefinition = new ColumnDefinition();
            grid.ColumnDefinitions.Add(columnDefinition);
        }

        for (int i = 0; i < width; i++)
        {
            for (int y = 0; y < height; y++)
            {
                ResButton b = new ResButton(); //selfmade buttons
                grid.Children.Add(b);
                Grid.SetColumn(b, i);
                Grid.SetRow(b, y);
            }
        }
    }
}

Code ResButton:

public partial class ResButton : UserControl
{
    public ResButton()
    {
        InitializeComponent();
    }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        ResWindow ResWindow = new ResWindow();
        ResWindow.Show();
    }
}

Code ResWindow:

public partial class ResWindow : Window
{
    public ResWindow()
    {
        InitializeComponent();
    }

    private void btnCancel_Click(object sender, RoutedEventArgs e)
    {
        this.Close();
    }

    private void btnSave_Click(object sender, RoutedEventArgs e)
    {
        //send Data to Filmgrid Window to change button
        this.Close();
    }
}

1 个答案:

答案 0 :(得分:0)

  

但是,我似乎无法弄清楚如何将名称和电影信息传回按钮进行配置。

作为快速解决方法,您可以使用相应的信息在ResWindow上创建公共属性:

public partial class ResWindow : Window {
  public string PersonName {get; set;}
  public string MovieName {get; set;}

  public ResWindow() => InitializeComponent();

  private void btnCancel_Click(object sender, RoutedEventArgs e) => this.Close();

  private void btnSave_Click(object sender, RoutedEventArgs e) {
    PersonName = txbPersonName.Text;
    MovieName = txbMovieName.Text;
    this.Close();
  }
}

然后,在ResButton中,您可以处理WindowClosing事件,并在窗口关闭之前检索数据:

public partial class ResButton : UserControl {
  public ResButton() => InitializeComponent();

  private void button_Click(object sender, RoutedEventArgs e) {
    ResButton btn = sender as ResButton;
    ResWindow ResWindow = new ResWindow();
    ResWindow.Closing += (s1, e1) => {
      ResWindow win = s1 as ResWindow;
      //do something here with ResWindow.PersonName and ResWindow.MovieName
      //you can access the btn variable here as well
    };
    ResWindow.Show();
  }
}
  

另外,我的所有按钮都不会像我创建它们那样着色,因为它们基本上都是&#34;相同&#34;对象

不,因为每次拨打new ResButton();时,您都会创建一个新的ResButton。如果您的问题是您没有办法引用每个ResButton,则有两种解决方案:

  1. .NET中的约定是事件处理程序的第一个参数是引发事件的对象。在这种情况下,Click事件的第一个参数将是单击的按钮。

  2. 或者,您可以保留对您在List<T>窗口中声明的某种Dictionary<TKey,TValue>Filmgrid中的所有按钮的引用。