Передача логического значения из одного окна в другое - PullRequest
0 голосов
/ 02 июля 2018

У меня есть две проблемы, которые, я уверен, являются отдельными в 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 голосов
/ 05 июля 2018

Первая проблема с меню, не возвращающим значения: Вам нужно событие, чтобы сообщить главному окну о том, что меню закрыто и должно получить новые значения из меню.

В Меню мы добавляем делегата и событие, чтобы указать, что данные изменились и меню закрывается:

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, и рисует правый крест и добавляет крест к прямоугольнику.

...