Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据不同窗口的数据更改按钮_C#_Wpf_Button - Fatal编程技术网

C# 根据不同窗口的数据更改按钮

C# 根据不同窗口的数据更改按钮,c#,wpf,button,C#,Wpf,Button,我目前正在尝试创建一个类似于电影院的预订应用程序。我在处理预订时遇到了一些问题,因为我创建了一个5x5的按钮网格,它调用一个单独的窗口。在该窗口中,您可以输入名称和要观看的电影。之后,按钮应以不同颜色显示,以表明此位置已预订 我能够生成按钮,每个按钮调用一个新窗口。但是,我似乎不知道如何将名称和电影信息传递回按钮进行配置。还有,我所有的按钮不是都像我创建的那样上色,因为它们基本上都是“相同”的对象吗?非常感谢您的帮助 代码Buttongrid: public partial class Film

我目前正在尝试创建一个类似于电影院的预订应用程序。我在处理预订时遇到了一些问题,因为我创建了一个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);
            }
        }
    }
}
代码窗口:

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();
    }
}
但是,我似乎不知道如何将名称和电影信息传递回按钮进行配置

作为一个快速解决方案,您可以在
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
中,您可以处理的事件,并在窗口关闭前检索数据:

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();
  }
}

还有,我所有的按钮不是都像我创建的那样上色,因为它们基本上都是“相同”的对象吗

不,因为每次调用
newresbutton(),您正在创建一个新的
ResButton
。如果您的问题是无法引用每个
ResButton
,则有两种解决方案:

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

  • 或者,您可以在
    Filmgrid
    窗口中声明的
    列表
    字典
    中保留对所有按钮的引用


  • 也许这不是你想要的,但是。。为什么你没有一个代表处来打印可用的座位,并在那里设置一个刷新机制(或发布-订阅模式),而你跳过了太多按钮的生成,以及将其添加到项目中的复杂性?@FedericoJoséSorenson听起来不错,但我不需要按钮来调用新窗口吗?所以我需要一个新的类,它的宽度和高度也可以创建一个按钮?抱歉,我对wpfNo问题@Byakko_Hakyu还比较陌生,当你打开第二个窗口,然后你预订座位时,在那一刻你有可能重新渲染你拥有的面板。为此,可以在窗口类上使用UpdateLayout()方法
    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();
      }
    }