2016-07-04 1 views
0

OK拡大エキスパンダーの中心を見つけるために、それは簡単でなければなりませんどのようにこれは私が困惑している

私が持っているこのコード

private void Expander_Expanded(object sender, RoutedEventArgs e) 
{ 
    var expand = e.OriginalSource as Expander; 
    if (expand != null) 
    { 
     var layer = sender as LayerBase; 
     var middle = expand.TranslatePoint(new Point(), layer) + new Vector(expand.ActualWidth/2,expand.ActualHeight/2); 
     Location.Centre = layer.ScreenToGeoPoint(middle); 
     e.Handled = true; 
    } 
} 

これは、コードが行うことになっているもので、

  • コントロールの中心にスクリーンポイントを配置します。
  • そのスクリーンポイントに関連する地理的ポイントを特定します。
  • は、それらの座標

マップ(左上隅にまだある、すなわちようにエキスパンダを動かすうちで、エキスパンダが表示されている地図の中心にあることを確認するように、これはそうであるにマップをrecentre正しい地理的位置)

しかし、ActualHeightとActualWidthは、実際の高さと実際の幅が中心点を大きなマージンで投げている折りたたまれたエクスパンダのサイズを返しています。これは、Expandedイベントコントロールが再描画される前に発砲しています。どのように私はビジュアルツリーの再描画の後に変更された拡張をキャプチャするのですか?

+0

あなたのパンダは、事前に拡張した状態で中心ますが、あなたはそれが完全に拡張された状態をを中心にしたいですか? – AnjumSKhan

+0

はい、私が達成しようとしていることは、私は何かシンプルだと私はちょうどそれを見つけることができないと確信しています – MikeT

+0

ScaleTransformの使用 – AnjumSKhan

答えて

0
private async void Expander_Expanded(object sender, RoutedEventArgs e) 
{ 
    var expand = e.OriginalSource as Expander; 
    if (expand != null) 
    { 
     var layer = sender as LayerBase; 
     // magic 
     await Dispatcher.InvokeAsync(() => { }); 
     expand.UpdateLayout(); 
     var middle = expand.TranslatePoint(new Point(), layer) + new Vector(expand.ActualWidth/2,expand.ActualHeight/2); 
     Location.Centre = layer.ScreenToGeoPoint(middle); 
     e.Handled = true; 
    } 
} 

これは動作します:)

+0

それはインスピレーションを受けたアイデアだったので、私はちょうど同じような考えに沿った遅れた作業をしていました – MikeT

+0

それを行うためのソリューション、それはWPFの方法WinFormsからApplication.DoEvents()を行う – cdmnk

関連する問題