我有一个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设计器的刷新并将这些附加属性重新应用于网格子项?
答案 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);
};
}
}