WPF XAML奇怪的列宽行为

时间:2017-08-23 15:38:45

标签: c# wpf xaml datagrid

以下DataGrid以细列开头,然后快速弹出到下面XAML中定义的宽度。

如何在没有初始行为的情况下从一开始就按照描述制作列宽?

            <DataGrid ItemsSource="{Binding Orders}" Name="_dataGridOrders" AutoGenerateColumns="False">

                <DataGrid.Columns>

                    <DataGridTextColumn Header="Order Number" Binding="{Binding OrderNumber}" Width="3.3*"/>
                    <DataGridTextColumn Header="Numeric ID" Binding="{Binding NumericId}" Width="3*"/>
                    <DataGridTextColumn Header="Ship To" Binding="{Binding ShipTo}" Width="4*"/>
                    <DataGridTextColumn Header="Order Date" Binding="{Binding OrderDate}" Width="5*"/>
                    <DataGridTextColumn Header="Calculated Weight" Binding="{Binding CalculatedWeight}" Width="4*"/>
                    <DataGridTextColumn Header="# Items" Binding="{Binding ItemsNumber}" Width="3*"/>
                    <DataGridTextColumn Header="Tracking" Binding="{Binding TrackingNumbers}" Width="6*"/>

                </DataGrid.Columns>

            </DataGrid>

1 个答案:

答案 0 :(得分:1)

我猜这里有点因为你没有提供所有相关代码,但我确信我知道问题是什么。

DataGrid从扩展到预期大小的精简列开始的原因是您要在网格上进行多重布局传递。这很可能是因为您在窗口变得可见后更改窗口大小。您可能会这样做的原因是将窗口大小恢复为上次执行应用程序的大小。如果你在窗口构造函数中执行此操作,您将获得闪烁的报告。要修复此操作,请将调整大小代码移动到窗口初始化事件处理程序。

所以不要这样......

    public MainWindow()
    {
        InitializeComponent();
        Rect r = App.Settings.MainWindowBounds;
        Rect desktop = new Rect(SystemParameters.VirtualScreenLeft, SystemParameters.VirtualScreenTop, SystemParameters.VirtualScreenWidth, SystemParameters.VirtualScreenHeight);
        if (desktop.Contains(r) && r.Width > 0.0 && r.Height > 0.0)
        {
            Left = r.Left;
            Top = r.Top;
            Height = r.Height;
            Width = r.Width;
        }
    }

这样做......

    private void Window_Initialized(object sender, RoutedEventArgs e)
    {
        Rect r = App.Settings.MainWindowBounds;
        Rect desktop = new Rect(SystemParameters.VirtualScreenLeft, SystemParameters.VirtualScreenTop, SystemParameters.VirtualScreenWidth, SystemParameters.VirtualScreenHeight);
        if (desktop.Contains(r) && r.Width > 0.0 && r.Height > 0.0)
        {
            Left = r.Left;
            Top = r.Top;
            Height = r.Height;
            Width = r.Width;
        }
    }

这是一种更有效的方法,因为窗口初始化处理程序在布局传递之前被调用。