Gostaria de obter a posição absoluta de um elemento em relação à janela / elemento raiz quando ele é clicado duas vezes. A posição relativa do elemento dentro de seu pai é tudo o que consigo chegar, e o que estou tentando chegar é o ponto em relação à janela. Já vi soluções de como obter o ponto de um elemento na tela, mas não na janela.
wpf
wpf-positioning
BrandonS
fonte
fonte
Para obter a posição absoluta de um elemento da IU dentro da janela, você pode usar:
Point position = desiredElement.PointToScreen(new Point(0d, 0d));
Se você estiver em um controle de usuário e simplesmente quiser a posição relativa do elemento de interface do usuário nesse controle, basta usar:
Point position = desiredElement.PointToScreen(new Point(0d, 0d)), controlPosition = this.PointToScreen(new Point(0d, 0d)); position.X -= controlPosition.X; position.Y -= controlPosition.Y;
fonte
Adicione este método a uma classe estática:
public static Rect GetAbsolutePlacement(this FrameworkElement element, bool relativeToScreen = false) { var absolutePos = element.PointToScreen(new System.Windows.Point(0, 0)); if (relativeToScreen) { return new Rect(absolutePos.X, absolutePos.Y, element.ActualWidth, element.ActualHeight); } var posMW = Application.Current.MainWindow.PointToScreen(new System.Windows.Point(0, 0)); absolutePos = new System.Windows.Point(absolutePos.X - posMW.X, absolutePos.Y - posMW.Y); return new Rect(absolutePos.X, absolutePos.Y, element.ActualWidth, element.ActualHeight); }
Defina o
relativeToScreen
parâmetro comotrue
para posicionamento do canto superior esquerdo de toda a tela oufalse
para posicionamento do canto superior esquerdo da janela do aplicativo.fonte
RenderTransform
do elemento e, portanto, precisa saber a posição absoluta do elemento na tela.Desde o .NET 3.0, você pode simplesmente usar
*yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*)
.Isso lhe dará o ponto 0, 0 do botão, mas em direção ao recipiente. (Você também pode dar um outro ponto que 0, 0)
Verifique aqui o doc.
fonte
Hm. Você deve especificar a janela em que clicou em O
Mouse.GetPosition(IInputElement relativeTo)
código a seguir funciona bem para mimprotected override void OnMouseDown(MouseButtonEventArgs e) { base.OnMouseDown(e); Point p = e.GetPosition(this); }
Suspeito que você precise se referir à janela não de sua própria classe, mas de outro ponto do aplicativo. Nesse caso
Application.Current.MainWindow
vai te ajudar.fonte