在设计师视图中重置附加属性

时间:2011-08-12 07:55:48

标签: wpf layout grid designer attached-properties

我有一个Grid的附加属性。它用于自动在Grid内部布置内容控件。它基本上是通过Children集合并将每个控件放在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
        }
    }

此代码可以工作并完成我需要的一切,但是有一个问题 - 当我在Expression Blend设计器中编辑网格的内容时,子控件上的Grid.Column和Grid.Row属性会被重置。这很烦人。如何检测Blend设计器的刷新并将这些附加属性重新应用于网格子项?

1 个答案:

答案 0 :(得分: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);
        };
    }
}