簡體   English   中英

wpf - 測量實際寬度和實際高度

[英]wpf - measuring the actual width and actual height

我在XAML中定義了一個Grid,就像

<Grid Name="myGrid" Grid.Row="0" Grid.Column="0">
     <!-- row/column definitions are defined in c# file -->
</Grid> 

這也是xaml文件中其他定義網格的一部分。

在構造函數的C#文件中,在行InitializeComponent()我已經為行和列定義了網格定義

public State1() {
    InitializeComponent();
    // define the rows
    for (int i = 0; i < 5; i++) {
       RowDefinition rowDef = new RowDefinition();
       rowDef.Height = new GridLength(1, GridUnitType.Star);
       myGrid.RowDefinitions.Add(rowDef);
    }

    // define the columns
    // column for Line
    ColumnDefinition colDef1 = new ColumnDefinition();
    colDef1.Width = new GridLength(8, GridUnitType.Star);
    myGrid.ColumnDefinitions.Add(colDef1);
    // column for TextBlock
    ColumnDefinition colDef2 = new ColumnDefinition();
    colDef2.Width = new GridLength(1, GridUnitType.Star);
    myGrid.ColumnDefinitions.Add(colDef2);

    for (int i = 0; i < 5; i++) {
        // draw dashed line
        Line line= new Line() {
            X2 = myGrid.ColumnDefinitions[0].ActualWidth, // actual width is 0
            Stroke = Brushes.Black, 
            StrokeDashArray = {10, 10, 10, 10},
            StrokeThickness = 1
        };
        Grid.SetRow(line, i);
        Grid.SetColumn(line, 0);
        myGrid.Children.Add(line);
        // draw text
        Viewbox vb_txtBlock = new Viewbox();
        TextBlock txtBlock = new TextBlock();
        txtBlock.Text = "Line " + (i+1);
        vb_txtBlock.Child = txtBlock;
        Grid.SetRow(vb_txtBlock, i);
        Grid.SetColumn(vb_txtBlock, 1);
        myGrid.Children.Add(vb_txtBlock);
    }
}

所以,我的問題是myGrid.ColumnDefinitions[0].ActualWidth返回0值。 我已經閱讀了其他問題和問題,並且我發現在測量和排列控件之前,不會設置ActualHeight和ActualWidth。

我的問題是,在我的c#代碼中,我可以測量實際的寬度和高度,以便我可以使用實際寬度和高度?

您應該將初始化代碼放在InitializeComponent之后並在Loaded事件中獲取測量值,如下所示:

    public Window2()
    {
        InitializeComponent();
        for (int i = 0; i < 5; i++)
        {
            RowDefinition rowDef = new RowDefinition();
            rowDef.Height = new GridLength(1, GridUnitType.Star);
            myGrid.RowDefinitions.Add(rowDef);
        }

        // define the columns
        // column for Line
        ColumnDefinition colDef1 = new ColumnDefinition();
        colDef1.Width = new GridLength(8, GridUnitType.Star);
        myGrid.ColumnDefinitions.Add(colDef1);
        // column for TextBlock
        ColumnDefinition colDef2 = new ColumnDefinition();
        colDef2.Width = new GridLength(1, GridUnitType.Star);
        myGrid.ColumnDefinitions.Add(colDef2);
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < 5; i++)
        {
            // draw dashed line
            Line line = new Line()
            {
                X2 = myGrid.ColumnDefinitions[0].ActualWidth, // actual width is 0
                Stroke = Brushes.Black,
                StrokeDashArray = { 10, 10, 10, 10 },
                StrokeThickness = 1
            };
            Grid.SetRow(line, i);
            Grid.SetColumn(line, 0);
            myGrid.Children.Add(line);
            // draw text
            Viewbox vb_txtBlock = new Viewbox();
            TextBlock txtBlock = new TextBlock();
            txtBlock.Text = "Line " + (i + 1);
            vb_txtBlock.Child = txtBlock;
            Grid.SetRow(vb_txtBlock, i);
            Grid.SetColumn(vb_txtBlock, 1);
            myGrid.Children.Add(vb_txtBlock);
        }
    }

調試時我得到一個有效的ActualWidth

您可以在重寫方法OnRenderSizeChanged()中添加您的代碼,如下所示

    protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
    {
        base.OnRenderSizeChanged(sizeInfo);
        ////Here put your code.
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM