将布尔值从一个窗口传递到另一个窗口

时间:2018-07-02 18:57:59

标签: c# wpf boolean

我有两个我可以肯定在WPF中是分开的问题。首先,布尔值xs不会传递到主窗口中,我已经通过测试它在哪里正确和在哪里错误来进行检查。如果在按钮单击事件中将它们添加到“堆栈面板”中,则交叉1和交叉2也不会绘制。抱歉,这是两个非常基本的问题,但是我找不到任何有效的方法。另外,我尝试尽可能多地阅读你们的书籍,以便如果您出于任何原因需要其他使它正常工作的信息,请随时提出要求。

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

}

1 个答案:

答案 0 :(得分:0)

菜单不返回值的第一个问题: 您需要一个事件来通知主窗口菜单已关闭,并且应该从菜单中检索新值。

在菜单中,我们添加了一个委托和事件以表示数据已更改并且菜单正在关闭:

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

在MainWindow中,我们有两个用于从菜单设置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,并绘制右十字并将该十字添加到矩形中。