1. 程式人生 > >WPF獲取控制元件位置的方法

WPF獲取控制元件位置的方法

WPF中提供了多種佈局方式,因此在佈局中的定位相對於WinForm的絕對定位要靈活的多,在WPF中,控制元件均沒有如WinForm中的Location屬性,但是,對應的提供了各種設定與獲取相對於承載元素的定位

一般來說,Wpf中的佈局控制元件大多都是相對定位(網格,流式,面板等),如果我們要改變控制元件在佈局中的位置可以用Margin,Padding等類似HTML中的方式,雖然說這種方式在WinForm也可用,但是WPF中的佈局方式與靈活性已經更接近與HTML了

WPF中也保留了相對傳統的佈局方式,如在Canvas容器中可以用SetLeft(),SetTop()來絕對定位

下來我們來簡單描述幾種獲取控制元件位置的方式,這也是很多新手容易糾結的地方

1.獲取滑鼠在控制元件中的座標

  1. //在Mouse相關的事件中的方式    
  2.    void item_MouseDown(object sender, MouseButtonEventArgs e)  
  3.     {  
  4.      Point point = e.GetPosition(canvas);   
  5.    }   
  6.    //或者Mouse的靜態方法GetPosition() 獲取與指定元素相對的滑鼠位置=>等同於上面   
  7.      Point point = Mouse.GetPosition(canvas); 

2.獲取控制元件相對於另一控制元件的座標

  1. //將相對於此元素的某個點轉換至相對於指定元素的座標中
  2. void item_MouseDown(object sender, MouseButtonEventArgs e)  
  3.  {  
  4.       Rectangle rectangle =sender as Rectangle;   
  5.     Point point = rectangle.TranslatePoint(new Point(),canvas);   
  6.  } 
  1. //將相對於此元素的某個點轉換至相對於指定元素的座標中
  2. void item_MouseDown(object sender, MouseButtonEventArgs e)  
  3.  {  
  4.       Rectangle rectangle =sender 
    as Rectangle;   
  5.     Point point = rectangle.TranslatePoint(new Point(),canvas);   
  6.  } 

3.獲取控制元件在Window中的座標

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

另外,c#中還提供了控制元件座標與螢幕座標之間的轉換,PointFromScreen,PointToScreen,這些就不再一一說明了

總之,根據實際情況選擇最適合的方式來獲取控制元件座標或定位