文章目录
- 文章合集地址
- WPF控价模版
- 解决重复嵌套标签书写的问题
- 实战
 
- WPF数据绑定
- 解决界面和业务数据沟通的问题
 
- WPF数据模版
- 数据模板解决数据的样式设置(以CellTemplate为例)
- 数据模板和控件模板的区别
- ItemTemplate 元素模板
- ItemTemplate是用于绝大部分控件的模板
 
- ItemsPanel 元素布局模板
- ItemPanel是用来解决重复布局的
 
 
文章合集地址
WPF基础知识博客专栏
 WPF微软文档
 WPF入门基础教程合集
WPF控价模版
WPF控件模板(6)
解决重复嵌套标签书写的问题
比如我写好了一个页面元素
 <Button Width="100">
     <TextBox Text="我是TextBox"></TextBox>
 </Button>

 我有好多个按钮都是这个样式,我就要重复这个代码好多次
   <Button Width="100" Height="30">
            <TextBox Text="我是TextBox"></TextBox>
        </Button>
        <Button Width="100"
                Height="30">
            <TextBox Text="我是TextBox"></TextBox>
        </Button>
        <Button Width="100"
                Height="30">
            <TextBox Text="我是TextBox"></TextBox>
        </Button>
        <Button Width="100"
                Height="30">
            <TextBox Text="我是TextBox"></TextBox>
        </Button>
        <Button Width="100"
                Height="30">
            <TextBox Text="我是TextBox"></TextBox>
        </Button>
控件模板就是为了解决重复地声明嵌套控件元素的问题。
实战
我们新建一个Button按钮
            <Button Content="正常按钮"
                    Width="100"
                    Height="30" />

 然后我们可以看到微软写的默认的按钮的副本

 简单来说,按钮为什么长成这个样子,都是通过模板设置的

 你看这个按钮,边框的黑的,文本居中放置,都是设置好的。
也不需要理解太多,我这里写一个控件模板的按钮
    <Window.Resources>
        <!--设置控件模版-->
        <ControlTemplate x:Key="defaultButtonTemplate"
                         TargetType="Button">
            <!--在这里相当于重新写了Button按钮,Button按钮的属性-->
            <Border Background="red"
                    CornerRadius="5">
                <StackPanel Orientation="Horizontal">
                    <TextBlock  Text="❥"
                                VerticalAlignment="Center" />
                    <!--这个是原本Button按钮的Content的属性,不添加就不显示Button了-->
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
                                      VerticalAlignment="{TemplateBinding VerticalAlignment}" />
                </StackPanel>
            </Border>
        </ControlTemplate>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <Button Content="控件按钮"
                    Width="100"
                    Height="30"
                    Template="{StaticResource defaultButtonTemplate}"
                    VerticalAlignment="Center"
                    HorizontalAlignment="Center" />
            <Button  Content="正常按钮"
                    Width="100"
                    Height="30" />
        </StackPanel>
    </Grid>
</Window>
实现效果:
 
 
WPF数据绑定
解决界面和业务数据沟通的问题
我们需要前端拿到我们后端的数据,把他展示到前面来。当然这个前后端都是相对来说。其实是界面拿到我们业务层的数据
CS代码
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            List<Student> students = new List<Student>();
            students.Add(new Student() { UserName = "小王", ClassName = "高二三班", Address = "广州市" });
            students.Add(new Student() { UserName = "小李", ClassName = "高三六班", Address = "清远市" });
            students.Add(new Student() { UserName = "小张", ClassName = "高一一班", Address = "深圳市" });
            students.Add(new Student() { UserName = "小黑", ClassName = "高一三班", Address = "赣州市" });
            //gd是前端的控件名称。设置gd的数据源
            gd.ItemsSource = students;
        }
    }
    ///声明Student实体类
    public class Student
    {
        public string UserName { get; set;}
        public string ClassName { get; set;}
        public string Address { get; set;}
    }
xmal代码
<!--这里声明gd,gd用来传给后端-->
 <DataGrid Name="gd"
                  AutoGenerateColumns="False"
                  CanUserSortColumns="True"
                  CanUserAddRows="False">
            <DataGrid.Columns>
                <!--绑定元素的UserName值,这里是弱绑定,不是强关联-->
                <DataGridTextColumn Binding="{Binding UserName}"
                                    Width="100"
                                    Header="学生姓名" />
                <DataGridTextColumn Binding="{Binding ClassName}"
                                    Width="100"
                                    Header="班级名称" />
                <DataGridTextColumn Binding="{Binding Address}"
                                    Width="200"
                                    Header="地址" />
      
            </DataGrid.Columns>
        </DataGrid>
实现效果

WPF数据模版
WPF数据模板(7)
 数据模板一般分为一下几类:
- ItemControl 
  - CellTemplate:列模板
- ItemTemplate:元素模板
- ContentTemplate:内容模板
 
数据模板解决数据的样式设置(以CellTemplate为例)
在上文数据绑定的代码中新增
 <DataGrid Name="gd"
                  AutoGenerateColumns="False"
                  CanUserSortColumns="True"
                  CanUserAddRows="False">
            <DataGrid.Columns>
                <!--绑定元素的UserName值,这里是弱绑定,不是强关联-->
        
                <DataGridTextColumn Binding="{Binding UserName}"
                                    Width="100"
                                    Header="学生姓名" />
                <DataGridTextColumn Binding="{Binding ClassName}"
                                    Width="100"
                                    Header="班级名称" />
                <DataGridTextColumn Binding="{Binding Address}"
                                    Width="200"
                                    Header="地址" />
                
        <!--使用Template进行扩展-->
        
                <DataGridTemplateColumn Header="操作"
                                        Width="100">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal"
                                        VerticalAlignment="Center"
                                        HorizontalAlignment="Left">
                                <Button Content="编辑" />
                                <Button Margin="8 0 0 0"
                                        Content="删除" />
                            </StackPanel>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

数据模板和控件模板的区别
| 数据模板 | 控件模板 | |
|---|---|---|
| 外标签 | CellTemplate | ControlTemplate | 
| 使用地方 | 动态数据页面样式 | 静态页面样式 | 
Tips:这里说的动态是随数据生成的页面元素
ItemTemplate 元素模板
ItemTemplate是用于绝大部分控件的模板
 <Window.Resources>
        <!--设置控件样式,绑定的就是之前说的数据绑定。注意,只是声明了类,但是没有声明数据源-->
        <DataTemplate x:Key="comTemplate">
            <StackPanel Orientation="Horizontal"
                        Margin="5,0">
                <Border Width="10"
                        Height="10"
                        Background="{Binding Code}" />
                <TextBlock Text="{Binding Code}"
                           Margin="5,0" />
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <StackPanel Orientation="Horizontal"
                    HorizontalAlignment="Center">
            <!--取名cob,用于后台绑定数据源-->
            <ComboBox Name="cob"
                      Width="120"
                      Height="30">
                <!--使用ItemTemplate绑定-->
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal"
                                    Margin="5,0">
                            <Border Width="10"
                                    Height="10"
                                    Background="{Binding Code}" />
                            <TextBlock Text="{Binding Code}"
                                       Margin="5,0" />
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
            <!--当然也可以写成样式的形式-->
            <ListBox Name="lib"
                     Width="120"
                     Height="100"
                     Margin="5,0"
                     ItemTemplate="{StaticResource comTemplate}" />
        </StackPanel>
    </Grid>
  public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            List<Color> ColorList = new List<Color>();
            ColorList.Add(new Color() { Code = "#FF8C00" });
            ColorList.Add(new Color() { Code = "#FF7F50" });
            ColorList.Add(new Color() { Code = "#FF6EB4" });
            ColorList.Add(new Color() { Code = "#FF4500" });
            ColorList.Add(new Color() { Code = "#FF3030" });
            ColorList.Add(new Color() { Code = "#CD5B45" });
            cob.ItemsSource = ColorList;
            lib.ItemsSource = ColorList;
        }
    }
    public class Color
    {
        public string Code { get; set; }
    }
实现效果

ItemsPanel 元素布局模板
ItemPanel是用来解决重复布局的
xmal
  <Grid>
        <ItemsControl Name="ic">
            <!--声明布局-->
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <!--声明配套的元素-->
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Width="50"
                            Height="50"
                            Content="{Binding Code}" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
cs代码
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            List<Test> tests = new List<Test>();
            tests.Add(new Test() { Code = "1" });
            tests.Add(new Test() { Code = "2" });
            tests.Add(new Test() { Code = "3" });
            tests.Add(new Test() { Code = "4" });
            tests.Add(new Test() { Code = "6" });
            ic.ItemsSource = tests;
        }
    }
    public class Test
    {
        public string Code { get; set; }
    }
实现效果



















