我在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);
}
在下面的图片中,您可以看到顶部和底部的列未按我想要的对齐
答案 0 :(得分:0)
问题出在if ((LocalList.Count > 0 || RemoteList.Count > 0) && measureInitializeCount++ == 0)
状态。当wpf第一次绘制窗口时,它将调用MeasureOverride
方法。但是,那时DataTreeGrid
还不可见,因此它们内部的GridView的列宽不会计算出来。
您想要做的是等待控件先绘制自身,然后设置适当的列宽。将您的代码更新为if ((LocalList.Count > 0 || RemoteList.Count > 0) && measureInitializeCount++ == 1)
,它应该会像魅力一样发挥作用!