2015-09-17 2 views
0

Я написал небольшую программу, которая должна отображать эллипс в точном положении мыши. Проблема в том, что, как я делаю это прямо сейчас, положение мыши и эллипса является точным только в центре экрана. Если я поместим мышь дальше в окно, они все дальше и дальше уходят.Установить положение элемента UI на позицию мыши

Я использую элемент MouseOver для обновления положения мыши.

enter image description here

Вот мой код:

  private void Window_MouseMove(object sender, MouseEventArgs e) 
     { 
     Main_Grid.Children.Clear(); 

     MousePos_Ellipse = new Ellipse(); 
     Point MousePos_Point = new Point(); 

     MousePos_Point = Mouse.GetPosition(Main_Grid); 

     Main_Grid.Children.Remove(MousePos_Ellipse); 

     SolidColorBrush mySolidColorBrush = new SolidColorBrush(); 


     mySolidColorBrush.Color = Color.FromArgb(55, 255, 255, 0); 
     MousePos_Ellipse.Fill = mySolidColorBrush; 
     MousePos_Ellipse.StrokeThickness = 2; 
     MousePos_Ellipse.Stroke = Brushes.Black; 

     // Set the width and height of the Ellipse. 
     MousePos_Ellipse.Width = 15; 
     MousePos_Ellipse.Height = 15; 
     // At this Point I do my Positioning 
     MousePos_Ellipse.Margin = new Thickness(left: MousePos_Point.X - (Main_Grid.ActualWidth/2) , top: MousePos_Point.Y - (Main_Grid.ActualHeight/2), right: 0 , bottom: 0); 

     //base.AddVisualChild(_circle); 

     // Add the Ellipse to the Grid 
     Main_Grid.Children.Add(MousePos_Ellipse); 

    } 
+2

использовать холст вместо сетки – thumbmunkeys

+0

Элемент управления холстом - это элемент управления, который вы хотите использовать для явного позиционирования дочерних элементов. Вы получите проблемы в других элементах управления, которые реализуют конкретные стили макета. – kenjara

ответ

3

Я предлагаю использовать Canvas вместо сетки.

С холста Вы можете просто установить позицию эллипса вроде:

Canvas.SetLeft(MousePos_Ellipse, MousePos_Point.X); 
    Canvas.SetTop(MousePos_Ellipse, MousePos_Point.Y); 

управления Сетка будет делать автоматическое позиционирование и определение размеров дочерних элементов и, следовательно, не так подходит для вашей цели.

+1

Вы, где абсолютно прав, я отредактировал его, и он отлично работает. «Ошибка» с событием без огня может быть исправлена ​​при установке фона на холст. http://stackoverflow.com/a/7766111/5276170 –

1

Отказ от ответственности; в то время как ответы выше будут исправлять вашу проблему, фактический вопрос не будет должным образом разрешен. Проблема, с которой вы сталкиваетесь, проистекает из вашей интерпретации проблемы по сравнению с тем, как ее видит компьютер.

Позиция вашего курсора относительно сетки не совпадает с положением относительно вашего экрана (то есть разные разрешения возвращают разные значения). Вот почему наши значения x и y будут дальше, чем вы выходите из центра. Вы можете исправить это, определив, что вы хотите, чтобы ваш X и Y позиции по отношению к форме, f.ex, например, так:

var relativePoint = this.PointToClient(Cursor.Position); 

заметное отличие в том, что здесь мы указываем клиенту, и поэтому получите относительное положение курсора в форме.

Смежные вопросы