繁体   English   中英

WPF XAML奇怪的列宽行为

[英]WPF XAML Strange column width behaviour

下面的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>

我在这里有点猜测,因为您还没有提供所有相关代码,但是我可以肯定我知道问题出在哪里。

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;
        }
    }

这是一种效率更高的方法,因为在布局通过之前调用了窗口初始化的处理程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM