由矩形作为画布的子项引起的问题

时间:2014-02-03 23:43:31

标签: c# wpf canvas rectangles

我有一个被如此定义的边框包围的画布

XAML:

<Border x:Name="CanvasBorder" BorderThickness="1" BorderBrush="Black" 
        HorizontalAlignment="Left" VerticalAlignment="Top" Height="480"
        Width="541"  Margin="50,50,0,0">
   <Canvas x:Name="CanvaContainer" Background="Transparent"
           HorizontalAlignment="Left" Height="479" Margin="1,1,1,1" 
           VerticalAlignment="Top" Width="540"
           MouseMove="CanvaContainer_MouseMove"/>
</Border>

这是鼠标事件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml.Linq;

namespace testing
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private double[][] array;
        private Rectangle rectCurrent;
        private int xPrevious = -1, yPrevious = -1, xCurrent = 0, yCurrent = 0;

        public MainWindow()
        {
            InitializeComponent();

            XDocument doc = XDocument.Load("Akulivik_Clay_High_Shrub.Xml");
            array = doc.Root.Elements("Month").Select(month => month.Elements().Select(x => (double)x).ToArray()).ToArray();
        }

        private void CanvaContainer_MouseMove(object sender, MouseEventArgs e)
        {
            Position(Mouse.GetPosition(CanvaContainer).X, Mouse.GetPosition(CanvaContainer).Y, out xCurrent, out yCurrent);

            valueXY.Content = String.Format("Array[Y : {1}][X : {0}] : {2}", xCurrent, yCurrent, array[yCurrent][xCurrent >= array.GetLength(0) ? 12 : xCurrent].ToString());

            realX.Content = "X : " + e.GetPosition(CanvaContainer).X;
            realY.Content = "Y : " + e.GetPosition(CanvaContainer).Y;

            if (!(xCurrent == xPrevious) && !(yCurrent == yPrevious))
                {

                    rectCurrent = new Rectangle();
                    rectCurrent.Stroke = new SolidColorBrush(Colors.Black);
                    rectCurrent.StrokeThickness = 2;
                    rectCurrent.Width = 45;
                    rectCurrent.Height = 40;
                    Canvas.SetLeft(rectCurrent, 45 * (xCurrent - 1));
                    Canvas.SetTop(rectCurrent, 40 * yCurrent);
                    CanvaContainer.Children.Add(rectCurrent);
                }
            else if (xCurrent == xPrevious && yCurrent == yPrevious)
                {
                    Console.WriteLine("Nothing");
                    xPrevious = xCurrent;
                    yPrevious = yCurrent;
                }
            else
                {
                    CanvaContainer.Children.Remove(rectCurrent);
                    Console.WriteLine("Outside");
                }       
        }

        private void Position(double xPos, double yPos, out int xValue, out int yValue)
        {
            xValue = (int)Math.Truncate(xPos / (int)45) +1;
            yValue = (int)Math.Truncate(yPos / (int)40);
        }
    }
}

所以关键是,当我在鼠标上绘制一个矩形时,每一件事都很好,但是当我到达canva边界上的矩形边界时,它会创建另一个矩形,因为事件是因为矩形而引发的是一个canva的孩子所以我认为它有同样的事件提出。行为如下图所示。

到达边境: enter image description here

到达时: enter image description here

更清楚的是,在第二张照片上,即使我到达边界也不应该有矩形。如果您需要更多描述,请在评论中说出来。

1 个答案:

答案 0 :(得分:0)

编译和运行您的示例所需的大部分代码都缺失了,如果您提供了一个完整的示例,那么您将有更好的机会回答这个问题。同时尝试将边框的SnapsToDevicePixels属性设置为“True”。

更新:你在这里遇到了一些问题。你的画布尺寸错误并且有1个像素的边距,你的边框没有给它足够的空间而你假设命中测试意味着光标在画布限制范围内(WPF中的默认命中测试行为是沿着右边缘也是)。尝试将您的xaml更改为:

<Border x:Name="CanvasBorder" BorderThickness="1" BorderBrush="Black"  HorizontalAlignment="Left" VerticalAlignment="Top" Margin="50,50,0,0" >
    <Canvas x:Name="CanvaContainer" Background="Transparent" Height="480" Width="540" MouseMove="CanvaContainer_MouseMove" />
</Border>

鼠标移动处理程序开始于此:

private void CanvaContainer_MouseMove(object sender, MouseEventArgs e)
{
    var pt = Mouse.GetPosition(CanvaContainer);
    if ((pt.X >= CanvaContainer.ActualWidth) || (pt.Y >= CanvaContainer.ActualHeight))
        return;
    Position(pt.X, pt.Y, out xCurrent, out yCurrent);