WPF获取和设置组件位置

设置位置

相对定位(网格,流式,面板等),改变控件在布局中的位置可以用Margin

1
2
3
double left=myButton.Margin.Left;
double top=myButton.Margin.Top;
myButton.Margin= new Thickness(left - 50, top, 0, 0);

绝对定位(Canvas)容器中可以用SetLeft(),SetTop()来绝对定位

1
2
Canvas.SetLeft(aBtn, aLocationX); //设置按钮在容器中的位置
Canvas.SetTop(aBtn, aLocationY);

获取位置

获取鼠标在控件中的坐标

常用于Canvas绘图使用。

1
2
3
4
5
6
7
8
//在Mouse相关的事件中的方式    
void item_MouseDown(object sender, MouseButtonEventArgs e)
{
Point point = e.GetPosition(canvas);
}

//或者Mouse的静态方法GetPosition()
Point point = Mouse.GetPosition(canvas);

获取控件相对于另一控件的坐标

1
2
3
4
5
6
//将相对于此元素的某个点转换至相对于指定元素的坐标中  
void item_MouseDown(object sender, MouseButtonEventArgs e)
{
Button mBtn = sender as Button;
Point point = mBtn.TranslatePoint(new Point(),canvas);
}

TranslatePoint方法里面,第一个参数传入的点是相对于当前元素的左上角为原点的坐标,而第二个值就是将要转换坐标的元素。

计算方法就是将传入的点换算为传入的转换坐标的元素的左上角原点的坐标。

简单示例

1
2
Point point = btn.TranslatePoint(new Point(), outerCanvas);
Canvas.SetTop(ketangTool, point.Y);

如下图所示

image-20230214161100657

我们获取到的btn相对于outerCanvas的偏移位置为(100,50)

获取控件在Window中的坐标

1
2
Window window =  Window.GetWindow(mBtn);  
Point point = mBtn.TransformToAncestor(window).Transform(new Point(0, 0));