簡體   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