利用C#動態生成Xaml


    之前在某一WPF交流群中一群友提問關於xaml轉c#的工具,目前好像沒有這方面的程序。忽而發覺在某些時候需要用C#動態生成xaml。例如在需要生成大量元素的時候,難道需要一個個的去寫嗎?這時用C#代碼去寫便比較高效率了。但是在一般情況下,是不需要用C#代碼去寫,用xaml效率反而更高。

    舉一個代碼例子吧,
xmal:

<Window x:Class="WpfApplication9.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
</Window>

可以看到,Window1中沒有任何容器和控件。

我們現在往里面加上一個三行一列的Grid容器:

Window1的構造函數中:

 

InitializeComponent();
            Grid grid = new Grid();    //實例化一個Grid
            RowDefinition row1= new RowDefinition();   //實例化一個Grid行
            RowDefinition row2 = new RowDefinition();  
            RowDefinition row3 = new RowDefinition();
            ColumnDefinition col = new ColumnDefinition();    //實例化一個Grid列

            row1.Height = new GridLength(3, GridUnitType.Star);   //設置行的高度(按比例)
            row2.Height = new GridLength(4, GridUnitType.Star);
            row3.Height = new GridLength(3, GridUnitType.Star);
         col.Width = new GridLength(10,GridUnitType.Star);     //設置列的寬度(完全填充)
             //row3.Height = new GridLength(51, GridUnitType.Pixel);   //設置行的高度(按像素)
            //row3.Height = GridLength.Auto;                          //設置行的高度(根據元素的高度來確定)
 
         
         grid.RowDefinitions.Add(row1);     //添加到grid的行集合中
            grid.RowDefinitions.Add(row2);
            grid.RowDefinitions.Add(row3);
            grid.ColumnDefinitions.Add(col);    //添加到grid 的列集合中

            this.Content = grid;             //設置grid為窗體的主容器

現在就將Grid容器構造完畢,並添加到了Window1中。

接下來添加幾個控件進去:

         TextBlock text = new TextBlock();
            text.Text = "這是一個示例!!(我占3份)";
            Button button1 = new Button();
            button1.Width = button1.Height = 50;
            Button button2 = new Button();
            button1.Content = "按鈕1(我占4份)";
            button2.Content = "按鈕2(我占3份)";
            grid.Children.Add(button1);
            grid.Children.Add(button2);
            grid.Children.Add(text);

現在若運行下,會發現所有控件都擠在了第一行中,因為我們上一步只是添加,還沒有設置,現在我們設置一下:

         Grid.SetRow(text, 0);        //設置text為第一行
              Grid.SetRow(button1, 1);  
            Grid.SetRow(button2, 2);  
           //Grid.SetColumn(text,0);  //設置text為第一列

到目前為止就已經寫好一個界面了,是不是很繁瑣?

image

 

好吧,我也是這么認為的,但是如果你要這樣寫:

image

Grid grid = new Grid();
                for (int g = 0; g <= 255; g  )
                {
                    for (int b = 0; b <= 255; b  )
                    {
                            if (grid.RowDefinitions.Count <= 255)
                            {
                                RowDefinition row = new RowDefinition();
                                row.Height = GridLength.Auto;
                                grid.RowDefinitions.Add(row);
                            }
                            
                             if(grid.RowDefinitions.Count <= 255)
                            {
                                ColumnDefinition column = new ColumnDefinition();
                                column.Width = GridLength.Auto;
                                grid.ColumnDefinitions.Add(column);
                            }
                             Color color = new Color();
                             color.A = Convert.ToByte(g);
                             color.R = 255;
                             color.G =0;
                             color.B = Convert.ToByte(b);
                           // Debug.WriteLine(color.ToString());
                             Border border = new Border();
                             border.BorderBrush = new SolidColorBrush(Colors.Black);
                             border.Background = new SolidColorBrush(color);
                             border.Margin = new Thickness(2);

                            
                            TextBlock texttool = new TextBlock();
                            texttool.Text = color.ToString();
                            border.ToolTip = texttool;
                              
                            border.Width = border.Height = 10;
                            
                            Grid.SetRow(border, b);
                            Grid.SetColumn(border, g);
                            grid.Children.Add(border);
                         }
                }
            this.Content = grid;

設置Border的背景分別為256*255種顏色,難道256*255個Border、255個列和255個行要手動寫嗎?自然用代碼效率是高的。

 

本文章只是簡單的提一下基礎的東西,因此不是很詳細。

 

至於那個神馬Xmal轉C#的程序,就有望大神們開發了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM