2011-08-12 5 views
0

グリッドの添付プロパティがあります。グリッド内のコンテンツコントロールを自動的にレイアウトするために使用されます。基本的には、子コレクションを通過し、すべてのコントロールをGridコントロールの次の空きセルに配置します。一度(Initializedイベントハンドラ内で)実行されます。デザイナビューで添付プロパティがリセットされる

public static readonly DependencyProperty AutoLayoutProperty = 
     DependencyProperty.RegisterAttached(
      "AutoLayout", 
      typeof(bool), 
      typeof(GridEx), 
      new UIPropertyMetadata(false, OnAutoLayoutChanged)); 

    private static void OnAutoLayoutChanged(
     DependencyObject d, 
     DependencyPropertyChangedEventArgs e) 
    { 
     var grid = d as Grid; 
     if (!grid.IsInitialized) 
      grid.Initialized += new EventHandler(grid_Initialized); 
     else { UpdateLayout(grid); } 
    } 
    private static void UpdateLayout(Grid grid) 
    { 
     foreach(var child in grid.Children) 
     { 
      // Set Grid.Column and Grid.Row properties on the child 
     } 
    } 

このコードは動作し、私は必要なすべてを行い、まだ一つの問題がある - 私は子コントロール上のものGrid.ColumnとGrid.Rowプロパティをリセットを取得Expression Blendのデザイナーでグリッドの内容を編集するとき。それはちょうど迷惑です。 Blendデザイナのリフレッシュを検出し、それらのアタッチされたプロパティをグリッドの子に再適用するにはどうすればよいですか?

答えて

0

代わりにLoadedイベントでお試しください。

編集 -

private static void OnAutoLayoutChanged(
    DependencyObject d, 
    DependencyPropertyChangedEventArgs e) 
{ 
    var grid = d as Grid;    
    grid.Loaded += (object sender, RoutedEventArgs e2) => 
    { 
     UpdateLayout(grid); 
    }; 

    // Workaround for Blend.. 
    if (DesignerProperties.GetIsInDesignMode(grid) == true) 
    { 
     grid.LayoutUpdated += (object sender, EventArgs e2) => 
     { 
      UpdateLayout(grid); 
     }; 
    } 
} 
+0

残念ながら、デザイナーのための追加された回避策は役立ちません。たとえばすぐにグリッド内のコントロールを削除する他のすべての子は、デザイナーでGrid.Row = 0およびGrid.Column = 0にリセットされます。 – Jefim

+0

@Jefim:あなたが何を意味するのか分かります。私はデザイナーのための回避策を追加しました。それがあなたのために動作するかどうかを確認 –

+0

ありがとう!それは魅力のように働いた! – Jefim

関連する問題