启用复选框后,在画布上存储两个鼠标单击位置

时间:2015-01-28 15:33:16

标签: c# wpf canvas checkbox mouseevent

我有一个复选框,当我点击它时,它应该允许用户在画布上单击两个位置,然后出现一个带有两次点击坐标的消息框,然后复选框应取消选中。我尝试了各种各样的事情并且遇到了一些问题。

  1. 选中此框是RoutedEventArgs,其中单击画布是MouseButtonEventArgs。
  2. 我无法存储第二次鼠标点击(第一次点击出现两次);我尝试了各种for循环,while循环等等。
  3. 我无法在消息框出现后取消选中此框,无论我把.Checked == false放在哪里。我收到一个错误,说system.windows.etcetc.checked只能在+ =或 - =的左侧显示。
  4. 我想在与复选框aka routedeventargs相关的函数中处理整个事情,而不是画布点击方法。

    我可以弄清楚#2但是1和3让我难过。

    这是从xaml中的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);
            }
        }
    

2 个答案:

答案 0 :(得分:2)

我看到了几个问题。

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 :(得分:2)

  1. This是如何获得鼠标坐标的(您不需要e,因此您的问题1无效)。

  2. 目前您的starPoint == endPoint。您是否了解在显示MessageBox之前必须获得2次鼠标点击事件(同时记住点数)?

  3. 您必须使用IsChecked属性,而不是Checked 事件来更改CheckBox的已检查状态。