[UWP]了解模板化控件(2.1):理解ContentControl

简介: 原文:[UWP]了解模板化控件(2.1):理解ContentControlUWP的UI主要由布局容器和内容控件(ContentControl)组成。布局容器是指Grid、StackPanel等继承自Panel,可以拥有多个子元素的类。
原文: [UWP]了解模板化控件(2.1):理解ContentControl

UWP的UI主要由布局容器和内容控件(ContentControl)组成。布局容器是指Grid、StackPanel等继承自Panel,可以拥有多个子元素的类。与此相对,ContentControl则只能包含单个子元素。

在UWP中,Button、CheckBox、ScrollViewer、Frame、ToolTip等都继承自ContentControl,其它控件则不是在ContentTemplate中使用ContentControl,就是被ContentControl使用,可以说ContentControl是UWP中最重要的控件。

ContentControl的定义并不复杂,它主要包含这四个属性:Content,ContentTemplate,ContentTemplateSelector,ContentTransitions。

1. Content

Content支持任何类型,它的值即ContentControl要显示的对象。可以将Content的类型大致分为两大类:

  • 未继承自UIElement的类型: ContentControl调用这些类的ToString()方法获取文本然后显示。
  • 继承自UIElement的类型: ContentControl直接将它显示在UI上。
<StackPanel>
    <ContentControl>
        <AdaptiveTrigger />
    </ContentControl>
    <ContentControl>
        <Rectangle Height="50"
                   Fill="Red" />
    </ContentControl>
</StackPanel>

img_fe1af05050e598e6f68505bb46317bc8.png

2. ContentTemplate

要将ContentControl的内容按自己的想法显示出来,可以使用ContentTemplate属性public DataTemplate ContentTemplate { get; set; })。DataTemplate是定义如何显示绑定的数据对象的XAML标记。DataTemplate定义的XAML块中元素的DataContext相当于所在ContentControl的Content。

下面的示例演示了怎么将ScoreModel显示在UI上。

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.Resources>
        <DataTemplate x:Key="PassTemplate">
            <Border Background="Green">
                <TextBlock Text="{Binding Score}"
                           Foreground="White"
                           FontSize="20"
                           Margin="20"
                           HorizontalAlignment="Center" />
            </Border>
        </DataTemplate>
    </Grid.Resources>
    <ContentControl ContentTemplate="{StaticResource PassTemplate}">
        <local:ScoreModel Score="30" />
    </ContentControl>
</Grid>

img_b53af356d5a6f6a16632eb7423ebe064.png

3. ContentTemplateSelector

如果需要根据Content动态地选择要使用的ContentTemplate,其中一个方法就是 public DataTemplateSelector ContentTemplateSelector { get; set; } 属性。

要使用ContentTemplateSelector,首先实现一个继承DataTemplateSelector的类,并重写protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 函数,在此函数中返回选中的DataTemplate。

以下的示例演示了SimpleDataTemplateSelector的功能,它通过判断Score是否大于60,从而选择返回PassTemplate或者FailTemplate。PassTemplate和FailTemplate都是SimpleDataTemplateSelector 的public属性,并在XAML中注入到SimpleDataTemplateSelector。

public class SimpleDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate PassTemplate { get; set; }

    public DataTemplate FailTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        var model = item as ScoreModel;
        if (model == null)
            return null;

        if (model.Score >= 60)
            return PassTemplate;
        else
            return FailTemplate;
    }
}
<StackPanel>
    <StackPanel.Resources>
        <DataTemplate x:Key="PassTemplate">
            <Border Background="Green">
                <TextBlock Text="{Binding Score}"
                           Foreground="White"
                           FontSize="20"
                           Margin="20"
                           HorizontalAlignment="Center" />
            </Border>
        </DataTemplate>
        <DataTemplate x:Key="FailTemplate">
            <Border Background="Red">
                <TextBlock Text="{Binding Score}"
                           Foreground="White"
                           FontSize="20"
                           Margin="20"
                           HorizontalAlignment="Center" />
            </Border>
        </DataTemplate>
        <local:SimpleDataTemplateSelector PassTemplate="{StaticResource PassTemplate}"
                                          FailTemplate="{StaticResource FailTemplate}"
                                          x:Key="DataTemplateSelector" />
        <Style TargetType="ContentControl">
            <Setter Property="ContentTemplateSelector"
                    Value="{StaticResource DataTemplateSelector}" />
        </Style>
    </StackPanel.Resources>
    <ContentControl>
        <local:ScoreModel Score="60" />
    </ContentControl>
    <ContentControl>
        <local:ScoreModel Score="30" />
    </ContentControl>
</StackPanel>

img_0467f7611e546ecb1340a0df6f488be7.png

注意:ContentTemplateSelector的缺点是需要创建多个模板,通常同一组数据的模板只有少部分的差别,可以在同一个模板中通过IValueConverter等方式显示不同的格式。

4. ContentTransitions

public TransitionCollection ContentTransitions { get; set; } 是类型为Transition的集合,提供Content改变时的过渡动画。

<ContentControl x:Name="ContentControl">
    <ContentControl.ContentTransitions>
        <TransitionCollection>
            <AddDeleteThemeTransition  />
        </TransitionCollection>
    </ContentControl.ContentTransitions>
</ContentControl>

UWP提供了很多优秀的动画效果,适当使用可以给人很好的用户体验。如果没有优秀的UI设计,老老实实用默认的ContentTransitions就不会错。

目录
相关文章
|
前端开发 UED
[UWP]不那么好用的ContentDialog
原文:[UWP]不那么好用的ContentDialog ContentDialog是UWP开发中最常用的组件之一,一个体验良好的UWP应用很难避免不去使用它。博客园里也有许多的文章介绍如何来利用ContentDialog实现各种自定义样式的弹窗界面。
1356 0
[UWP]使用Acrylic(亚克力)
原文:[UWP]使用Acrylic(亚克力) 1. 前言 在 如何使用Fluent Design System 这篇文章里已经简单介绍过Reveal的用法,这篇再详细介绍其它内容。 自Windows 8 放弃Aero后,群众对毛玻璃回归的呼声一致都很大。
1549 0
[UWP]了解IValueConverter
原文:[UWP]了解IValueConverter 1. 前言 IValueConverter是用于数据绑定的强大的武器,它用于Value在Binding Source和Binding Target之间的转换。
982 0
|
C# 程序员
[UWP]做个调皮的BusyIndicator
原文:[UWP]做个调皮的BusyIndicator 1. 前言 最近突然想要个BusyIndicator。做过WPF开发的程序员对BusyIndicator应该不陌生,Extended WPF Toolkit 提供了BusyIndicator的开源实现,Silverlight Toolkit也有一个,这次想要把这个控件移植到UWP中。
945 0
|
搜索推荐 API 开发者
简单说一下UWP中的JumpList
原文:简单说一下UWP中的JumpList   在Windows10的10856这个版本中,微软为桌面版提供了一组新的应用交互方式,磁贴和Toast通知的个性化都有了一定的改善。针对磁贴方面,微软为我们提供了一组新的API来扩充我们对应用的交互方式——JumpList。
857 0
|
API C# Windows
起调UWP的几种方法
原文:起调UWP的几种方法 由于种种原因吧,我需要使用一个WPF程序起调一个UWP程序,下面总结一下,给自己个备份。 启动UWP程序的关键是协议启动 给我们的UWP应用添加一个协议,like this: 然后使用协议启动该UWP有一下几种方式: 1.
1042 0
|
数据安全/隐私保护 安全 API
win10 uwp ApplicationView
原文:win10 uwp ApplicationView 本文和大家介绍一个重要的类,他可以用来设置窗口,如设置启动大小,设置是否允许截图,是否进入全屏,所有和窗口有关的,都可以在他这里设置。
1228 0
|
前端开发
win10 UWP 蜘蛛网效果
原文:win10 UWP 蜘蛛网效果 我看见了知乎首页登录背景和普通的地球人写的博客,发现了个好看的效果。 那么我来告诉大家如何做这个效果。
1159 0
|
数据格式 XML API
UWP: 实现 UWP 应用自启动
原文:UWP: 实现 UWP 应用自启动 在上一篇文章中,我们实现了使用命令行来启动 UWP 应用,在这一篇文章中,我们会实现 UWP 应用自启用的实现,也即开机后或用户登陆后,应用自己启动。这些特性原来都是 Win32 程序所具备的,UWP 能够支持这些特性使得它和 Win32 程序的行为进一步相同。
1678 0
|
C# Windows
[UWP]了解模板化控件(3):实现HeaderedContentControl
原文:[UWP]了解模板化控件(3):实现HeaderedContentControl 1. 概述 来看看这段XMAL: 是不是觉得它们中出了一个叛徒?这个示例中除了ListBox控件其它都自带Header,但是ListBox没有Header属性,只好用一个TextBlock模仿它的Header。
1204 0