WPF中提供了多種布局方式,因此在布局中的定位相對於WinForm的絕對定位要靈活的多,在WPF中,控件均沒有如WinForm中的Location屬性,但是,對應的提供了各種設定與獲取相對於承載元素的定位
一般來說,Wpf中的布局控件大多都是相對定位(網格,流式,面板等),如果我們要改變控件在布局中的位置可以用Margin,Padding等類似HTML中的方式,雖然說這種方式在WinForm也可用,但是WPF中的布局方式與靈活性已經更接近與HTML了
WPF中也保留了相對傳統的布局方式,如在Canvas容器中可以用SetLeft(),SetTop()來絕對定位
關於控件定位詳細具體可參考 http://msdn.microsoft.com/zh-cn/library/ms751709.aspx
下來我們來簡單描述幾種獲取控件位置的方式,這也是很多新手容易糾結的地方
1.獲取鼠標在控件中的坐標
//在Mouse相關的事件中的方式 void item_MouseDown(object sender, MouseButtonEventArgs e) { Point point = e.GetPosition(canvas); } //或者Mouse的靜態方法GetPosition() 獲取與指定元素相對的鼠標位置=>等同於上面 Point point = Mouse.GetPosition(canvas);
2.獲取控件相對於另一控件的坐標
//將相對於此元素的某個點轉換至相對於指定元素的坐標中 void item_MouseDown(object sender, MouseButtonEventArgs e) { Rectangle rectangle =sender as Rectangle; Point point = rectangle.TranslatePoint(new Point(),canvas); }
3.獲取控件在Window中的坐標
Window window = Window.GetWindow(canvas); Point point = canvas.TransformToAncestor(window).Transform(new Point(0, 0));
另外,c#中還提供了控件坐標與屏幕坐標之間的轉換,PointFromScreen,PointToScreen,這些就不再一一說明了
總之,根據實際情況選擇最適合的方式來獲取控件坐標或定位