• DataTemplate和ControlTemplate联系与区别


    ---恢复内容开始---

    正如标题中的两个拼接的单词所说,DataTemplate就是数据显示的模板,而ControlTemplate是控件自身的模板。(个人理解,错误请指出,谢谢)

    我们看这二者在两类不同的控件中如何使用:

    一:ItemsControl

      我们可以利用ControlTemplate来设置控件外表,用DataTemplate来填充控件内容。

    <Page.Resources>
            <DataTemplate x:Key="dataTemplate">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition></ColumnDefinition>
                        <ColumnDefinition></ColumnDefinition>
                        <ColumnDefinition></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0"  Text="{Binding Name}"></TextBlock>
                    <TextBlock Grid.Column="1"  Text="{Binding Age}"></TextBlock>
                    <TextBlock Grid.Column="2"   Text="{Binding Sex}"></TextBlock>
                </Grid>
            </DataTemplate>
        </Page.Resources>
        <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
            
            <ListBox x:Name="itemsControl" Width="300" Height="400" ItemsSource="{Binding Mode=OneWay}" ItemTemplate="{StaticResource dataTemplate}">
                <ListBox.Template>
                    <ControlTemplate>
                        <Grid >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition></ColumnDefinition>
                                <ColumnDefinition></ColumnDefinition>
                                <ColumnDefinition></ColumnDefinition>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="auto"></RowDefinition>
                                <RowDefinition></RowDefinition>
                            </Grid.RowDefinitions>
                            <TextBlock Grid.Row="0" Grid.Column="0" FontSize="20" Text="姓名"></TextBlock>
                            <TextBlock Grid.Row="0" Grid.Column="1" FontSize="20" Text="年龄"></TextBlock>
                            <TextBlock Grid.Row="0" Grid.Column="2" FontSize="20" Text="性别"></TextBlock>
                            <ItemsPresenter   Grid.Row="1" Grid.ColumnSpan="3">
                               
                            </ItemsPresenter>
                            
                        </Grid>
                        
                    </ControlTemplate>
                </ListBox.Template>
    
                
            </ListBox>
            <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Height="56" Margin="102,157,0,0" VerticalAlignment="Top" Width="190" Click="button_Click"/>
        </Grid>
    View Code

      对应的隐藏代码如下:

        public class Info
        {
            public string Name { get; set; } = "佚名";
            public int Age { get; set; } = 0;
            public string Sex { get; set; } = "不详";
        }
        public sealed partial class MainPage : Page
        {
            public MainPage()
            {
                this.InitializeComponent();
                
            }
    
            private void button_Click(object sender, RoutedEventArgs e)
            {
                List<Info> list = new List<Info>();
                list.Add(new Info());
                list.Add(new Info { Age = 15, Name = "小莉", Sex = "" });
                list.Add(new Info { Age = 18, Name = "小桂子", Sex = "" });
    
                itemsControl.ItemsSource = list;
            }
    }
    View Code

    通过单击button,可以向列表控件中填充内容。

    值得注意的是,列表表头在ControlTemplate中设置,而内标内容则是由DataTemplate通过数据绑定动态加载。

    程序运行如下:

    但是发现列表并没有按照表头的格式展开,这是因为ListBox中ListBoxItem中显示内容的宽度是自适应的。未来美观,我们作如下修改

    设置ListBox的属性ItemContainerStyle如下:

    <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                   <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
                    </Style>
    </ListBox.ItemContainerStyle>

    运行程序就发现如下显示了:

    值得一提的是,我们在定义Info类的时候使用了C#6的新语法

    public [类型] [变量名]{get;set;} = [初始化值];

    好像跑题了。以上是ControlTemplate和DataTemplate在ItemsControl类型控件中的一个示例。而ContentControl类型控件中的用法也类似。唯一区别是在ContentTemplate中的ContentPresenter和ItemsPresenter之间。是哪种控件,就用哪种类型的Presenter。记住,设置了ContentTemplate,一定要设置ContentPresenter或ItemsPresenter,否则数

    据不显示。

    来点官方的

    public sealed class ControlTemplate : Windows.UI.Xaml.FrameworkTemplate
    
    public class DataTemplate : Windows.UI.Xaml.FrameworkTemplate
    
    
    
    public class FrameworkTemplate : Windows.UI.Xaml.DependencyObject
        Windows.UI.Xaml 的成员
    
    摘要:
    创建元素的元素树。FrameworkTemplate 是那些具有特定模板化行为(包括 ControlTemplate 和 DataTemplate)的类的基类。

    通过上面的,你应该已经看出他们的共同点了。

    至于核心的,在深入的。我也就不懂了。。该请教周家安,林政这些.net界的大牛了。向前辈致敬!

  • 相关阅读:
    260.java风格简介
    259.Java标识符和注释
    258.计算机网络的性能指标
    257.计算机网络的组成
    256.常见的网络拓扑结构
    HDFS文件的读写流程入门学习
    Servlet入门
    Linux下扩展根分区-非LVM
    Tomcat基本使用
    JDBC入门
  • 原文地址:https://www.cnblogs.com/cjw1115/p/4709331.html
Copyright © 2020-2023  润新知