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_Boolean - Fatal编程技术网

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

C# 将布尔值从一个窗口传递到另一个窗口,c#,wpf,boolean,C#,Wpf,Boolean,我有两个问题,我很确定它们在WPF中是分开的。首先,布尔xs没有被传递到主窗口,我通过测试它在哪里是真的,在哪里不是来检查主窗口。如果我在按钮单击事件中将十字1和十字2添加到堆栈面板,则十字1和十字2也不会绘制。很抱歉,这是两个非常基本的问题,但我找不到任何有效的。我也尽量不让你们读太多的书,所以无论出于什么原因,如果你们还需要其他东西来让它发挥作用,请不要犹豫 public partial class MainWindow : Window { public MainWindow()

我有两个问题,我很确定它们在WPF中是分开的。首先,布尔xs没有被传递到主窗口,我通过测试它在哪里是真的,在哪里不是来检查主窗口。如果我在按钮单击事件中将十字1和十字2添加到堆栈面板,则十字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();
    }
}

}菜单未返回值的第一个问题: 您需要一个事件来向主窗口发出信号,表明菜单已关闭,并且应该从菜单中检索新值

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

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。