【问题标题】:Passing a Boolean from one window to another将布尔值从一个窗口传递到另一个窗口
【发布时间】:2018-12-11 00:57:32
【问题描述】:

我有两个问题,我很确定它们在 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();
    }
}

}

【问题讨论】:

  • 你试过设置十字架的可见性吗?
  • 此代码不起作用。 XAML 在哪里?这如何编译 Rectangle.MouseLeftButtonDown += Rectangle8_MouseLeftButtonDown;?
  • @L0uis iv'e 大大缩写了完整的编译版本帮助我可以发送它。
  • 是的@RickHodder

标签: c# wpf boolean


【解决方案1】:

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

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

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

第二个问题:Cross 1 和 Cross 2 添加到 Stack Panel 后不绘制。

您需要创建新的十字并将它们添加到所需的矩形。首先将处理程序删除到在主窗口中的构造函数之外单击的矩形。

void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            RectangleClicked = true;
            HandleMove(); //draw a new cross either X or O to 'this' square
        }

对于您添加的每个矩形,添加一个处理程序以在单击的矩形内绘制右十字。然后,十字绘图处理程序将检查是否设置了 x 或 o,并绘制右十字并将十字添加到矩形。

【讨论】:

  • 我已经尝试按照您对十字架的建议,但我似乎无法让处理程序工作。我可能误解了你,所以如果你能举一个更好的例子来说明你的意思呢? @L0uis .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
相关资源
最近更新 更多