使用PointToScreen在wpf中查找控件的位置

时间:2014-07-17 11:59:18

标签: c# wpf point

我试图在主窗口中找到用户控件的相对坐标。我尝试使用" Control.PointToScreen()"方法,但没有运气。每次我这样做,我得到一个例外:

System.InvalidOperationException:此Visual未连接到PresentationSource

我认为这与我在正确呈现视觉效果之前调用pointToScreen有关,因为我已经在我的主要构造函数中调用了该方法。

无论如何,我想听听你是否有人提示/解决方案/想法我怎么可能解决这个问题。

为了清楚我想要做什么,我的控件包含一个photocontrol,我需要在我的maincontrol里面的确切位置,因为我想使用这些坐标创建一个控件的副本顶部

尝试使用PointToScreen。

3 个答案:

答案 0 :(得分:10)

在UserControl的Loaded事件的代码寄存器中。 这应该可以解决当您尝试获取位置时尚未呈现视觉效果的错误。

YourControl.Loaded += ControlLoaded;

public void ControlLoaded(object sender, EventArgs e){
    Console.WriteLine(YourControl.PointToScreen(new Point(0,0));
}

修改

由于您希望控件的位置相对于窗口,因此最好尝试一下。

YourControl.TransformToAncestor(YourWindow).Transform(new Point(0,0))

答案 1 :(得分:2)

由于Contend渲染无效,我找到了解决问题的方法。

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
  ItemsControl ItemsControl = UCEnvironmentControl.GetItemsControlPhotos();
  Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => Control.PointToScreen(new Point(0,0));
}

这样,它会在LoadedEvent中触发,但等待渲染内容,最后它会为你提供坐标并设置你的控件

答案 2 :(得分:0)

Max Mazur的解决方案正在为我工​​作:

public partial class MainWindow : Window
    {
        Point locationOfYourControl;

        public MainWindow()
        {
                InitializeComponent();
                this.ContentRendered += MainWindow_ContentRendered;
        }

        private void MainWindow_ContentRendered(object sender, EventArgs e)
        {
            locationOfYourControl = YourControl.PointToScreen(new Point(0, 0));
        }
    }