像素坐标不正确

时间:2011-09-20 01:01:45

标签: wpf

我使用以下代码获取鼠标位置的像素坐标。

private void canvas_MouseMove(object sender, MouseEventArgs e)
{
     startPoint = e.GetPosition(this);
}

但是,如果用户使用滚动条向下移动一点,则此代码不起作用。我得到了错误的坐标,并且没有在鼠标位置下绘制对象。有什么想法在这里发生什么?

1 个答案:

答案 0 :(得分:1)

你正在做什么应该(或多或少)工作。但是,对于您正在收听的MouseMove事件,您可能会遇到一些问题。

这是一个展示所需行为的示例应用。

XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid Margin="12">
        <ScrollViewer Name="scrollViewer"
                HorizontalScrollBarVisibility="Auto"
                VerticalScrollBarVisibility="Auto"
                MouseMove="ScrollViewer_MouseMove">
            <Canvas Name="canvas" Width="800" Height="600" />
        </ScrollViewer>
    </Grid>
</Window>

代码隐藏:

using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void ScrollViewer_MouseMove(object sender, MouseEventArgs e)
        {
            Point mousePosition = e.GetPosition(canvas);
            var rectangle = new Rectangle
            {
                RenderTransform = new TranslateTransform(
                    mousePosition.X,
                    mousePosition.Y),
                Stroke = Brushes.Black,
            };
            canvas.Children.Add(rectangle);
        }
    }
}

此处的关键是我将MouseMove事件绑定到ScrollViewer,并检查了Canvas的位置。