簡體   English   中英

C#為什么StackPanel不調整大小?

[英]c# Why stackpanel don't resize?

我正在使用silverlight,必須在c#中編寫代碼而不是xaml,並且我有一個具有1行1列的網格(myGrid)。 此Grid進一步包含Border( rect ),並且此rect內部包含具有1行3列的另一個網格( childGrid )。

而且,此smallGrid在第二列中還包含一個stackpanel(sp),其大小是動態形成的,但是smallGrid不會根據stackpanel sp的增長大小來調整大小。

我的代碼是這樣的:

   Grid myGrid = new Grid();
   myGrid.Width = 750;
   myGrid.HorizontalAlignment = HorizontalAlignment.Left;
   myGrid.VerticalAlignment = VerticalAlignment.Top;
   myGrid.ShowGridLines = false;

   ColumnDefinition colDef1 = new ColumnDefinition();
   myGrid.ColumnDefinitions.Add(colDef1);
   RowDefinition rowDef1 = new RowDefinition();
   myGrid.RowDefinitions.Add(rowDef1);


   Border rect = new Border();
   rect.Width = g.Width;
   rect.Height = g.Height;
   rect.BorderThickness = new Thickness(2);
   rect.BorderBrush = new SolidColorBrush(Colors.LightGray);

   Grid childGrid = new Grid();
   ColumnDefinition colDef1 = new ColumnDefinition();
   ColumnDefinition colDef2 = new ColumnDefinition();
   ColumnDefinition colDef3 = new ColumnDefinition();
   childGrid.ColumnDefinitions.Add(colDef1);
   childGrid.ColumnDefinitions.Add(colDef2);
   childGrid.ColumnDefinitions.Add(colDef3);


   int NumberOfRadioButton = 0;
   StackPanel sp = new StackPanel();

   foreach(var item in param.Component.Attributes.Items) {
       NumberOfRadioButton++;
       RadioButton rb = new RadioButton();
       rb.GroupName = item;
       rb.Content = item;
       sp.Children.Add(rb);

   }
   Grid.SetRow(sp, 1);
   Grid.SetColumn(sp, 1);
   childGrid.Height = sp.Height;
   childGrid.Children.Add(sp);

   TextBlock txtblk1ShowStatus = new TextBlock();
   TextBlock txtblkLabel = new TextBlock();

   txtblkLabel.Text = param.Label;
   Grid.SetColumn(txtblkLabel, 0);
   Grid.SetRow(txtblkLabel, 1);
   childGrid.Children.Add(txtblkLabel);

   txtblk1ShowStatus.Text = param.Name;
   Grid.SetColumn(txtblk1ShowStatus, 2);
   Grid.SetRow(txtblk1ShowStatus, 1);
   childGrid.Children.Add(txtblk1ShowStatus);

   rect.Child = childGrid;
   Grid.SetRow(rect, 1);
   myGrid.Children.Add(rect);

myGridchildGrid的大小必須根據動態創建的單選按鈕上增加的stackpanel大小而動態增加嗎? 由於所有單選按鈕均未顯示在第2列中,因此請注意,由於跨界而未顯示以下快照中的最后一個單選按鈕(“高”緊接在“高”之后): 在此處輸入圖片說明

編輯:我什至嘗試了這3個步驟,但仍然相同:(1)刪除rect.Width = g.Width; rect.Height = g.Height; childGrid.Height = sp.Height;

(2)添加rowdef.Height = new GridLength(1,GridUnitType.Auto);(因為我在垂直擴展)

(3)添加sp.Orientation = Orientation.Vertical;

Edit2:myGrid很喜歡這個:

            Grid myGrid = new Grid();
            myGrid.Width = 750;       
            myGrid.HorizontalAlignment = HorizontalAlignment.Left;
            myGrid.VerticalAlignment = VerticalAlignment.Top;
            myGrid.ShowGridLines = false;

            ColumnDefinition colDef1 = new ColumnDefinition();
            myGrid.ColumnDefinitions.Add(colDef1);       
            int totalRows = p.Parameter.Count() + p.Separator.Count();

            for (int i = 0; i < totalRows; i++)
            {
                myGrid.RowDefinitions.Add(new RowDefinition());

            }    

EDIT3 :(我的修改后的位代碼的建議)

  Border rect = new Border();
// rect.Width = g.Width;
// rect.Height = g.Height;
    rect.BorderThickness = new Thickness(2);
    rect.BorderBrush = new SolidColorBrush(Colors.LightGray);

    Grid childGrid = new Grid();
    ColumnDefinition colDef1 = new ColumnDefinition();
    ColumnDefinition colDef2 = new ColumnDefinition();
    ColumnDefinition colDef3 = new ColumnDefinition();
    RowDefinition rowdef = new RowDefinition();
    childGrid.ColumnDefinitions.Add(colDef1);
    childGrid.ColumnDefinitions.Add(colDef2);
    childGrid.ColumnDefinitions.Add(colDef3);

    childGrid.RowDefinitions.Add(rowdef);
    rowdef.Height= new GridLength(1, GridUnitType.Auto);

     int NumberOfRadioButton =0;
     StackPanel sp = new StackPanel();
     sp.Orientation = Orientation.Vertical;

     foreach (var item in param.Component.Attributes.Items)
     {                 
         NumberOfRadioButton++;
         RadioButton rb = new RadioButton();
         rb.GroupName = item;
         rb.Content = item;
         sp.Children.Add(rb);

     }
    Grid.SetRow(sp, LoopCount);
    Grid.SetColumn(sp, 1);
    childGrid.ShowGridLines = true;
 //   rect.Height = double.NaN;
    childGrid.Children.Add(sp);

    TextBlock txtblk1ShowStatus = new TextBlock();
    TextBlock txtblkLabel = new TextBlock();

    txtblkLabel.VerticalAlignment = System.Windows.VerticalAlignment.Center;
    txtblkLabel.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
    txtblkLabel.TextAlignment = System.Windows.TextAlignment.Center;
    txtblkLabel.FontWeight = FontWeights.Bold;
    txtblkLabel.FontSize = 15;
    txtblkLabel.FontStyle = FontStyles.Normal;
    txtblkLabel.Padding = new Thickness(5, 10, 5, 10);

    txtblkLabel.Text = param.Label;
    Grid.SetColumn(txtblkLabel, 0);
    Grid.SetRow(txtblkLabel, LoopCount);
    childGrid.Children.Add(txtblkLabel);

    txtblk1ShowStatus.VerticalAlignment = System.Windows.VerticalAlignment.Center;
    txtblk1ShowStatus.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
    txtblk1ShowStatus.TextAlignment = System.Windows.TextAlignment.Center;
    txtblk1ShowStatus.FontWeight = FontWeights.Bold;
    txtblk1ShowStatus.FontSize = 15;
    txtblk1ShowStatus.FontStyle = FontStyles.Normal;
    txtblk1ShowStatus.Padding = new Thickness(5, 10, 5, 10);

    txtblk1ShowStatus.Text = param.Name;
    Grid.SetColumn(txtblk1ShowStatus, 2);
    Grid.SetRow(txtblk1ShowStatus, LoopCount);
    childGrid.Children.Add(txtblk1ShowStatus);

    rect.Child = childGrid;
    Grid.SetRow(rect, LoopCount);
    myGrid.Children.Add(rect);

您需要在這里考慮很多事情。

如果您想要水平擴展smallGrid ,請設置

sp.Orientation=Orientation.Horizontal

然后將smallGrid中的列寬設置為“自動”。

colDef.Width = new GridLength(1, GridUnitType.Auto); // Auto

您實際上並不需要myGrid ,直接使用Border就足夠了。

取消分配Height,例如:

rect.Width = g.Width;
rect.Height = g.Height;
childGrid.Height = sp.Height;

否則,如果您想要垂直擴展的smallGrid,請確保Border rect的父級(或myGrid,以防萬一,您決定保留它)允許擴展Height(主要是檢查高度是否未硬編碼為固定編號或其他內容) )

另外,將

smallGrid.ShowGridLines = true;

讓您更好地了解實際占用的空間。

最后,也要這樣做

int totalRows = p.Parameter.Count() + p.Separator.Count(); 

for (int i = 0; i < totalRows; i++) 
{ 
var rowDef=new RowDefinition(); 
rowdef.Height = new GridLength(1, GridUnitType.Auto); 
myGrid.RowDefinitions.Add(rowDef); 

}

暫無
暫無

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

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