C#WPF将2个不同的GridViewColumn设置为最大宽度

时间:2018-07-26 20:21:09

标签: c# wpf xaml

我在2个不同的子控件中有2个不同的GridViewColumns。下面只是一个GridViewColumns外观的示例。

<GridViewColumn Width="auto" x:Name="StatusColumn" HeaderTemplate="{StaticResource HeaderTemplate}">
   <GridViewColumnHeader Content="Status" Tag="DisplayStatus" HorizontalContentAlignment="Left" Click="GridViewColumnHeader_Click"/>
      <GridViewColumn.CellTemplate>
        <DataTemplate>
           <TextBlock Text="{Binding FileStatus.DisplayStatus, Mode=OneWay}" HorizontalAlignment="Left" Style="{StaticResource ConflictStateStyle}"/>
        </DataTemplate>
   </GridViewColumn.CellTemplate>
</GridViewColumn>

如您所见,“宽度”设置为“自动”。 创建控件后,此GridViewColumn设置为列中的最大大小文本。

现在我想要的是我有2个不同的GridViewColumns,我想将它们的宽度设置为每个的最大大小。 IE在下面的代码中我的宽度为 Math.Max(remoteColumn.ActualWidth,localColumn.ActualWidth)

下面是我所做的一个示例,但没有用:

int measureInitializeCount = 0;
protected override Size MeasureOverride(Size availableSize)
{
  if ((LocalList.Count > 0 || RemoteList.Count > 0) && measureInitializeCount++ == 1)
  {
    var measure = base.MeasureOverride(availableSize);

    var remoteGridView = (GridView)RemoteSyncCollectionControl.DataTreeGrid.View;
    var localGridView = (GridView)RemoteSyncCollectionControl.DataTreeGrid.View;

    InitializeColumnWidth(remoteGridView.Columns[0], localGridView.Columns[0]);
    InitializeColumnWidth(remoteGridView.Columns[1], localGridView.Columns[1]);
    InitializeColumnWidth(remoteGridView.Columns[2], localGridView.Columns[2]);
    InitializeColumnWidth(remoteGridView.Columns[3], localGridView.Columns[3]);

    void InitializeColumnWidth(GridViewColumn remoteColumn, GridViewColumn localColumn)
    {
      var width = Math.Max(remoteColumn.ActualWidth, localColumn.ActualWidth);

      if (width > 0 && width != float.NaN)
      {
        (remoteColumn).Width = width;
        (localColumn).Width = width;
      }
    }
  }

  return base.MeasureOverride(availableSize);
}

在下面的图片中,您可以看到顶部和底部的列未按我想要的对齐

enter image description here

1 个答案:

答案 0 :(得分:0)

问题出在if ((LocalList.Count > 0 || RemoteList.Count > 0) && measureInitializeCount++ == 0)状态。当wpf第一次绘制窗口时,它将调用MeasureOverride方法。但是,那时DataTreeGrid还不可见,因此它们内部的GridView的列宽不会计算出来。

您想要做的是等待控件先绘制自身,然后设置适当的列宽。将您的代码更新为if ((LocalList.Count > 0 || RemoteList.Count > 0) && measureInitializeCount++ == 1),它应该会像魅力一样发挥作用!