1. 程式人生 > >C#進階 WPF基礎一 XAML控制元件基礎、佈局

C#進階 WPF基礎一 XAML控制元件基礎、佈局

一、控制元件模型

WPF的控制元件與WinForm類似。區別在於WPF的控制元件可以用XAML手寫,並且功能更多更強大

二、XAML語言

1、概念:在WPF中用來描述控制元件的語言.

特點:

與XML、HTML語言類似,但對大小寫敏感

一個XAML標籤代表NEW一個控制元件物件

2、控制元件的通用屬性:

Visibility:控制元件是否可見,他的值是個列舉型別:Visibility.Visible可見;Visibility.Collapsed不可見;Visibility.Hidden 不可見,但保留空間

IsEnabled:是否可用

Background:背景顏色

FontSize:設定字型

TextBox的常用屬性:

MaxLength: 獲取或設定文字框的最大輸入字元數,值為int型別

TextWrapping: 獲取或設定文字框是否可自動換行,值為列舉型別:TextWrapping.Wrap為可自動換行

IsReadOnly:只讀,值為bool型別

PasswordBox:取值的屬性為:Password

CheckBox:是否選中的屬性:IsChecked,型別是bool?。可為空的bool型別

RadioButton:單選框,如果要分組,同組新增一個共同的GroupName屬性。

DatePicker: 屬性SelectedDate,值為datatime?型別,可空型別

Image: Source屬性為圖片路徑(可以是相對路徑)

Slider: Maximum最大值,double型別。Minimum,double型別,value,當前值,double型別

ProgressBar:跟Slider用法類似。特殊的屬性:IsIndeterminate bool型別,是否不確定值

三、可空資料型別

可空資料型別:引用型別、自定義類、string,大部分類

不可空資料型別:值型別--int、boolean、decimal、DataTime等

但是資料庫內的值型別是可為null的,所以為了配合資料庫,C#中使用了值型別後加一個“?”後,就可以為null了

例如:int  n = null;系統會報錯,但是int? n = null;是可以的

int?還可以用普通int型別來賦值,比如:int n = 5;  int? n1=n;

但是int?不能轉換為int。    在int?資料不為null時可以用強制轉換: int? n1 = 5;  int n2 =(int) n1;

四、頁面佈局 : 不用拖控制元件的方式佈局,因為拖的控制元件一般不會隨視窗的變大而變大。

基本佈局:有StackPanel、Grid、DockPanel幾種佈局容器,放在佈局容器中的控制元件按照佈局容器的特點進行佈局

1、StackPanel佈局:控制元件排列,在StackPanel中排列的控制元件會隨著視窗的大小相應變化大小。

屬性:

Orientation: 列舉型別;值為Vertical時橫向排列(預設值),Horizontal縱向排列

2、控制元件中的巢狀: 在按鈕的內容插入圖片。這一點Winform做不到

<Button>
            <Button.Content>
                <Image Source="Images/042.jpg"></Image>
            </Button.Content>
        </Button>

還可以插入文字框:TextBox 或其他

因為按鈕Button的Content只能被賦值一次,所以如果想在按鈕中巢狀多個其他控制元件,可以賦值為一個StackPanel,然後再在StackPanel中排列許多控制元件

<Button.Content>
                <StackPanel>
                    <Image Source="Images/042.jpg" Height="115" Width="140"/>
                    <TextBlock><Run Text="xxx"/></TextBlock>
                </StackPanel>
            </Button.Content>


3、Grid 佈局: Grid字面上是網格的意思。在XAML語言中,它可以用來分柵格

如果不定義高度和寬度,Grid會自動均分。分好的柵格里面可以新增控制元件,控制元件的位置由Grid的行和列屬性來控制

<Grid>
            <Grid.RowDefinitions>  <!--分為3行,並設定第一行高度為60-->
                <RowDefinition Height="60"></RowDefinition>
                <RowDefinition></RowDefinition>
                <RowDefinition></RowDefinition>
            </Grid.RowDefinitions>
            
            <Grid.ColumnDefinitions>    <!--分為4列,並設定第二列高度為60-->
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition Width="60"></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            
            <!--給柵格中新增按鈕控制元件,預設為行和列的下標為0.可以在屬性中修改行和列的值-->
            <Button Grid.Row="1" Grid.Column="1">使用者名稱</Button> 
            <TextBox Grid.Row="1" Grid.Column="2" Background="Purple" Text="xxx" ></TextBox>   
            <!--如果控制元件要佔幾行,用Grid的屬性rowSpan或者ColunmSpan-->
            <Image Grid.Row="0" Grid.Column="4" Grid.RowSpan="3" Source="Images/042.jpg"></Image>
        </Grid>

4、在C#窗體程式碼中佈局

1)在XAML中新建一個能佈局的控制元件,並給一個Name屬性(便於程式中呼叫)

2)在程式中用New的方式新建控制元件物件

3)通過XAML控制元件的Children屬性,將控制元件物件加入到佈局中,從而完成佈局;有些是用Add的方法新增

5、總練習例題:製作連連看棋盤  (動態新增控制元件物件)

1)在XAML中新建一個柵格Grid,並命名Name屬性為:gridGame

2)用Definition生成一個10*10的柵格:

for (int i = 0; i < 10; i++)
            {               
                RowDefinition rowDef = new RowDefinition(); //建立行佈局物件
                gridGame.RowDefinitions.Add(rowDef);   //新增到Grid中
                ColumnDefinition colDef = new ColumnDefinition();  //建立列布局物件
                gridGame.ColumnDefinitions.Add(colDef);  //新增到Grid中
            }

3)建立10*10的Image控制元件,並設定其圖片資源和柵格位置,最後加入總柵格Grid中

//隨機數物件
            Random r = new Random();

            //2、生成10*10的Image控制元件
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    Image img = new Image(); //通過迴圈建立10*10個控制元件物件

                    //這裡要記住用法,不像XAML中會自動解析,C#必須要用到其他幾個類將路徑轉成圖片資源
                    img.Source = new BitmapImage(new Uri("Images/"+r.Next(1,10)+".png",UriKind.Relative));
                    //設定相應的柵格位置
                    Grid.SetRow(img,i);
                    Grid.SetColumn(img,j);
                    //將設定好的控制元件放入Grid中
                    gridGame.Children.Add(img);
                }
            }