2015-11-04 67 views
-1

我有点卡在我目前的项目。MVVM获取控制位置

我正在使用一个可怕的API,需要在任何给定时间告知何时何地绘制。此API不公开任何控件,我需要一个控件才能正确放置绘制的对象。

我所做的是我在我的视图中在我的网格中放置了一个画布。这个画布占据了我绘制的API元素需要占用的空间。所以,通过获取画布实际宽度和实际高度,我可以绘制出适当大小的API元素。我遇到的问题是API元素的位置。 Canvas在任何时候都处于适当的位置,但是当程序第一次启动时,Canvas.TranslatePoint(new System.Windows.Point(0,0),App.Current.MainWindow);返回0,0。只要我操作UI并导致Canvas调整大小,位置函数就会返回真实位置,并且我的API元素将绘制在合适的位置。我的问题是为什么最初的位置是0?我该如何补救?我从UserControl_Loaded事件调用初始绘图函数。

谢谢

P.S.我认为最初的0,0是相对坐标而不是绝对坐标是否会错误?

+0

我使用这个函数来获取地点: 'System.Windows.Point位置= WaveformCanvas.TranslatePoint(新System.Windows.Point(0,0),App.Current.MainWindow);' 然而,这个函数声称这两个元素不共享一个共同的祖先: 'location = WaveformCanvas.TransformToVisual(App.Current.MainWindow).Transform(new System.Windows.Point(0,0));' 但是after第一次调用这个函数时,二者确实共享一个共同的祖先。 –

回答

0

我想通了我的问题 - 我的控制不是PresentationSource的一部分。长话短说,你无法获得屏幕上尚未显示的控件的位置。我的修复是这样的: private void WaveformCanvas_Loaded(object sender, RoutedEventArgs e){ if((sender as Canvas).IsVisible) { (this.DataContext as StudioControlViewModel).MoveWaveform(); } }

对我来说,MoveWaveform()函数调用WaveformCanvas.TranslatePoint(new System.Windows.Point(0, 0), App.Current.MainWindow);

所以,现在的功能只有当控制是可见的,它解决了我所有的问题被调用。