2012-05-28 56 views
1

我想用這行代碼來獲取通過TransformToVisual方法的用戶控件的位置正常工作。但現在我想dynamicaly這樣定義的控件:TransformToVisual方法不適用於動態控制

stackPanel.Children.Add(new Control()); 

座標偏移和TransformToVisual方法忽略了利潤率和對齊(返回StackPanel中的左上角)。

的XAML層次是以下幾點:

<Grid x:Name="ParentElement"> 
    <StackPanel> 
     <StackPanel> 
      <Border> 
       <StackPanel> 
        <TextBlock /> 
        <StackPanel x:Name="stackPanel" /> 
       </StackPanel> 
      </Border> 
     </StackPanel> 
    </StackPanel> 
</Grid> 

所以我的問題是:有沒有辦法再次得到正確的座標?

感謝,kwitee

回答

1

我能解決這個問題自己:

如果我打電話UpdateLayout請致電TransformToVisual前()()的方法,座標不再是壞的。 ActualWidth和height屬性存在一些其他小問題,它們返回爲零。我通過在Dispatcher.BeginInvoke委託中調用這些屬性來解決這個問題。

1

我想添加一些東西,因爲我遇到了一個非常類似的問題,導致我一段時間的問題。當我在WinRT for Windows 8.1的UIElement上訪問Dispatcher時,我無法找到BeginInvoke方法,因此我無法嘗試列出的解決方案。

經過一些測試,但我認爲我的問題的根本原因是更改UI的佈局,然後在系統有時間正確更新佈局之前調用TransformToVisual。這可能與上面提到的相同。我發現在未受其佈局影響的用戶界面上運行TransformToVisual會返回正確的結果,但這僅適用於佈局在存在問題的情況下進行更新的UI部分。

這似乎是爲了使TransformToVisual正常工作而更改佈局時,UI必須有機會對佈局更新作出「反應」。在我的情況下,我改變了佈局,然後在調用TransformToVisual之後立即(在Tapped事件處理程序中緊接着另一行之後)。由於這兩個調用都在同一個方法中,因此UI可能無法在更新佈局和調用TransformToVisual之間處理任何新消息(我假設佈局更新在UI處理循環中作爲消息被推送) 。如果我將TransformToVisual移動到MouseUp事件中(當時我正在使用鼠標),那麼一切正常。在您的案例中調用BeginInvoke可能會大大推動新工作的完成,導致隊列中的任何等待工作(佈局更新)首先被處理。

相關問題