1

いくつかのエキスパンダー コントロールも含む ChildWindow (Silverlight) を使用しています。あるケースでは、エキスパンダー コントロールが展開されると、子ウィンドウの下部が下部の画面から下に拡張されますが、上部にはまだ余裕があります。

子ウィンドウを開いたばかりのように、子ウィンドウを画面の中央に配置するにはどうすればよいですか? (それは簡単ですが、私は実行可能だとは思いません)

(手動介入) ContentRoot の RenderTransform を実行しました。そのコレクションには 6 つの変換があり、そのうちの 2 つは TranslateTransforms です。最初の X/Y プロパティを更新し (2 つのうちどちらを変更する必要があるかわかりません)、RenderTransform プロパティを TransformGroup 全体で更新すると、ChildWindow を画面上で移動することに成功しましたが、そうではありません。私が期待しているように振る舞う。

Expander コントロールが展開されたときに、ChildWindow_SizeChanged イベントが発生しない理由もわかりません。ウィンドウのサイズは変化するのに、なぜ起動しないのでしょうか?

わかりました - 質問が多すぎます。最初の 1 つだけに答えてください。残りは、WPF/Silverlight がどのように機能しているかについての私の知識を記入することです...

よろしく、リチャード

4

1 に答える 1

3

このブログによる回答: http://www.kunal-chowdhury.com/2010/11/how-to-reposition-silverlight-child.html

/// <summary>
/// Centers the Silverlight ChildWindow in screen.
/// </summary>
/// <remarks>
/// 1) Visual TreeHelper will grab the first element within a ChildWindow - this is the Chrome (Title Bar, Close button, etc.)
/// 2) ContentRoot - is the first element within that Chrome for a ChildWindow - which is named this within the template of the control (Childwindow)
/// 3) Using the container (named ContentRoot), pull out all the "Transforms" which move, or alter the layout of a control
///   TranslateTransform - provides X,Y coordinates on where the control should be positioned
/// 4) Using a Linq expression, grab teh last TransLateTransfrom from the TransformGroup
/// 5) Reset the TranslateTransform to point 0,0 which should reference the ChildWindow to be the upper left of the window.  However, this is setting
///    is probably overridden by a default behaviour to always reset the window window to the middle of the screen based on it's size, and the size of the browser
///    I would have liked to animate this, but this likely requires a storyboard event that I don't have time for at this moment.
///    
/// This entire process to move, or alter a window in WPF was a total learning experience.
/// </remarks>
/// <param name="childWindow">The child window.
public static void CenterInScreen(this ChildWindow childWindow)
{
  var root = VisualTreeHelper.GetChild(childWindow, 0) as FrameworkElement;
  if (root == null) { return; }

  var contentRoot = root.FindName("ContentRoot") as FrameworkElement;
  if (contentRoot == null) { return; }

  var transformgroup = contentRoot.RenderTransform as TransformGroup;
  if (transformgroup == null) { return; }

  TranslateTransform transform = transformgroup.Children.OfType<TranslateTransform>().LastOrDefault();
  if (transform == null) { return; }

  transform.X = 0;
  transform.Y = 0;

}

}

于 2011-06-20T21:05:39.440 に答える