C# 将布尔值从一个窗口传递到另一个窗口
我有两个问题,我很确定它们在WPF中是分开的。首先,布尔xs没有被传递到主窗口,我通过测试它在哪里是真的,在哪里不是来检查主窗口。如果我在按钮单击事件中将十字1和十字2添加到堆栈面板,则十字1和十字2也不会绘制。很抱歉,这是两个非常基本的问题,但我找不到任何有效的。我也尽量不让你们读太多的书,所以无论出于什么原因,如果你们还需要其他东西来让它发挥作用,请不要犹豫C# 将布尔值从一个窗口传递到另一个窗口,c#,wpf,boolean,C#,Wpf,Boolean,我有两个问题,我很确定它们在WPF中是分开的。首先,布尔xs没有被传递到主窗口,我通过测试它在哪里是真的,在哪里不是来检查主窗口。如果我在按钮单击事件中将十字1和十字2添加到堆栈面板,则十字1和十字2也不会绘制。很抱歉,这是两个非常基本的问题,但我找不到任何有效的。我也尽量不让你们读太多的书,所以无论出于什么原因,如果你们还需要其他东西来让它发挥作用,请不要犹豫 public partial class MainWindow : Window { public MainWindow()
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
StackPanel myStackPanel = new StackPanel();
Rectangle Rectangle = new Rectangle();
Rectangle.MouseLeftButtonDown += Rectangle8_MouseLeftButtonDown;
Rectangle Cross1 = new Rectangle();
Rectangle Cross2 = new Rectangle();
myStackPanel.Children.Add(Rectangle8);
bool xs = Menu.Xs;
bool os = Menu.Os;
bool RectangleClicked = false;
void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
RectangleClicked = true;
}
void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
RectangleClicked = true;
}
if (RectangleClicked == true)
{
myStackPanel.Children.Add(Cross2);
myStackPanel.Children.Add(Cross1);
}
if (xs == true)
{
MessageBox.Show("Xs is true");
}
}
}
窗口二代码
public partial class Menu : Window
{
public Menu()
{
InitializeComponent();
}
public static bool Xs { get; private set; }
public static bool Os { get; private set; }
public void Button_Click(object sender, RoutedEventArgs e)
{
Xs = true;
Os = false;
this.Close();
}
public void Button_Click_1(object sender, RoutedEventArgs e)
{
Xs = false;
Os = true;
MessageBox.Show("Xs is false");
this.Close();
}
}
}菜单未返回值的第一个问题: 您需要一个事件来向主窗口发出信号,表明菜单已关闭,并且应该从菜单中检索新值 在菜单中,我们添加一个委托和事件,以表示数据已更改,菜单正在关闭:
public partial class Menu : Window
{
public delegate void DataChangeHandler(object sender, EventArgs e);
// an instance of the delegate
public DataChangeHandler DataChanged;
public Menu()
{
InitializeComponent();
}
public static bool Xs { get; private set; }
public static bool Os { get; private set; }
public void Button_Click(object sender, RoutedEventArgs e)
{
Xs = true;
Os = false;
DataChanged?.Invoke(this, new EventArgs());
this.Close();
}
public void Button_Click_1(object sender, RoutedEventArgs e)
{
Xs = false;
Os = true;
MessageBox.Show("Xs is false");
DataChanged?.Invoke(this, new EventArgs());//when menu closes announce change event if a handler is wired up to listen.
this.Close();
}
}
在主窗口中,我们从菜单中设置了x和o的两个属性。这些都在构造函数之外
public partial class MainWindow : Window
{
bool xs;
bool os;
public MainWindow()
{
//snip
Button Start = new Button();
Start.Height = 50;
Start.Width = 200;
Start.Margin = new Thickness(500, -100, 0, 0);
Start.Content = "Start";
myStackPanel.Children.Add(Start);
Start.Click += Start_Click;
xs = Menu.Xs;
os = Menu.Os;
}
private void Start_Click(object sender, RoutedEventArgs e)
{
Menu win2 = new Menu();
win2.DataChanged += MenuClosed; //handler
win2.Show();
}
public void MenuClosed(object sender, EventArgs e) //fires after closing menu
{
xs = Menu.Xs; //get new values from Menu for x and o
os = Menu.Os;
}
第二个问题:如果我将交叉点1和交叉点2添加到堆栈面板,则它们不会绘制
您需要创建新的十字并将其添加到所需的矩形中。首先,将处理程序删除到在Mainwindow中的构造函数外部单击的矩形
void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
RectangleClicked = true;
HandleMove(); //draw a new cross either X or O to 'this' square
}
对于添加的每个矩形,添加一个处理程序以在单击的矩形内绘制右十字。然后,交叉绘制处理程序将检查是否设置了x或o,并绘制右十字并将十字添加到矩形中。是否尝试设置十字的可见性?此代码无效。XAML在哪里?这是如何编译Rectangle.MouseLeftButtonDown+=Rectangle8_MouseLeftButtonDown@L0uis iv'e大大简化了它。完整的编译版本有助于我发送它。完整版本@RickHodderI我试着按照你的建议去做十字架,但我似乎无法让处理者工作。我可能误解了你,所以如果你能举一个更好的例子来说明你的意思,也许@10UIS。