Первая проблема с меню, не возвращающим значения:
Вам нужно событие, чтобы сообщить главному окну о том, что меню закрыто и должно получить новые значения из меню.
В Меню мы добавляем делегата и событие, чтобы указать, что данные изменились и меню закрывается:
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, и рисует правый крест и добавляет крест к прямоугольнику.