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