更改列不会在运行时反映

时间:2018-02-20 19:06:34

标签: c# wpf dependency-properties columndefinition

我在运行时更改ColumnDefinitions时出现问题。当我这样做时,Width 不会立即反映 。如果我调整当前窗口/用户控件的大小,那么Width确实会反映出来。

我也关注MVVM,我有一个DependencyProperty,允许我根据需要更改Grid

目前,我正在使用此功能,如果我调整窗口大小并控制Grid处于启用状态,则可以正常使用...

public static void ColumnSpacerChanged(
            DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            if (!(obj is Grid) || ((Grid)obj).ColumnDefinitions.Count == 0 || (int)e.NewValue == (int)e.OldValue)
                return;

            Grid grid = (Grid)obj;
            for (int i = 0; i < grid.ColumnDefinitions.Count; i++)
            {
                if(grid.ColumnDefinitions[i].Tag != null && grid.ColumnDefinitions[i].Tag.ToString() == COLUMN_SPACER)
                {
                    grid.ColumnDefinitions[i] = new ColumnDefinition() { Width = new GridLength((int)e.NewValue, GridUnitType.Pixel), Tag = COLUMN_SPACER };
                }
            }

            grid.UpdateLayout(); // Tried this, but doesn't work

        }
  

我尝试过以下操作,但没有工作。

 grid.UpdateLayout();
 grid.Refresh; // (off the parent)

当我在运行期间更改ColumnDefinitions时,我是否遗漏了一些他们立即反映的内容?

1 个答案:

答案 0 :(得分:0)

我在@Mike Strobel的帮助下找到了解决方案......

InvalidateArrange()

需要调用此方法以使元素的排列状态(布局)无效。在此失效之后,元素将更新其布局并异步反映。