我试图在主窗口中找到用户控件的相对坐标。我尝试使用" Control.PointToScreen()"方法,但没有运气。每次我这样做,我得到一个例外:
System.InvalidOperationException:此Visual未连接到PresentationSource
我认为这与我在正确呈现视觉效果之前调用pointToScreen有关,因为我已经在我的主要构造函数中调用了该方法。
无论如何,我想听听你是否有人提示/解决方案/想法我怎么可能解决这个问题。
为了清楚我想要做什么,我的控件包含一个photocontrol,我需要在我的maincontrol里面的确切位置,因为我想使用这些坐标创建一个控件的副本顶部
尝试使用PointToScreen。
答案 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));
}
}