启用复选框时,在 canvas 上存储两次鼠标单击位置

Store two mouse click positions on canvas when checkbox enabled

我现在有一个复选框,当我点击它时,它应该允许用户点击 canvas 上的两个地方,然后会出现一个带有两次点击坐标的消息框,然后该复选框应取消选中自身。我已经尝试了各种方法并使 运行 陷入了一些问题。

  1. 选中复选框是一个 RoutedEventArgs,而点击 canvas 是一个 MouseButtonEventArgs。
  2. 我无法存储第二次鼠标点击(第一次点击出现两次);我尝试了各种 for 循环、while 循环等
  3. 无论我将 .Checked == false 放在哪里,我都无法在消息框出现后取消选中该框。我收到一条错误消息,指出 system.windows.etcetc.checked 只能出现在 += 或 -= 的左侧。

我想在与复选框相关的函数中处理整个事情,也就是 routedeventargs 而不是 canvas 单击方法。

我能弄清楚#2,但 1 和 3 难倒了我。

这是从 xaml 中的 canvas mousedown 订阅的方法示例:

   public void get_Scaling(object sender, MouseButtonEventArgs e)
    {
        Point startPoint;
        Point endPoint;

        while (Scale_btn.IsChecked == true)
        {
            startPoint = e.GetPosition(canvas1);

            endPoint = e.GetPosition(canvas1);

            System.Windows.MessageBox.Show("Start point is" + startPoint + "and end point is" + endPoint, "test", MessageBoxButton.OK, MessageBoxImage.Information);
        }
    }

我发现了几个问题。

1) 以编程方式取消选中 CheckBox 的方法是使用 IsChecked 属性.

Scale_btn.IsChecked = false;

2) 请记住,您的 while 循环 运行 在单个 MouseDown 事件处理程序内。您将无法在该 while 循环中捕获两个不同的 MouseDown 事件。为了实现您的目标,您需要将 Point 对象带到事件处理程序之外,并使用另一个变量来跟踪您正在捕获的点击。

    bool firstPointCaptured = false;
    Point startPoint;
    Point endPoint;

    private void get_Scaling(object sender, MouseButtonEventArgs e)
    {

        if (Scale_btn.IsChecked == true)
        {
            if (!firstPointCaptured)
            {
                startPoint = Mouse.GetPosition(canvas1);
                firstPointCaptured = true;
            }
            else
            {
                endPoint = Mouse.GetPosition(canvas1);
                System.Windows.MessageBox.Show("Start point is" + startPoint + "and end point is" + endPoint, "test", MessageBoxButton.OK, MessageBoxImage.Information);
                Scale_btn.IsChecked = false;
                firstPointCaptured = false;
            }
        }
    }
  1. This 是您获取鼠标坐标的方式(您不需要 e,因此您的问题 1 无效)。

  2. 目前您的starPoint == endPoint。你知道你必须获得 2 次鼠标点击事件(同时记住点)才能显示 MessageBox?

  3. 您必须使用 IsChecked property, instead of Checked 事件 来更改 CheckBox.

    [=29= 的选中状态]