控件 UI: 字體繼承, Style, ControlTemplate, SystemReso
介紹
重新想象 Windows 8 Store Apps 之 控件 UI
字體繼承 - 繼承父輩的 Font 相關的信息
Style - 樣式
ControlTemplate - 控件模板
系統資源 - 系統內置的樣式資源
VisualState - 視 圖狀態
VisualStateManager - 視圖狀態管理器
示例
1、演示字體繼承
Controls/UI/FontInherit.xaml
<Page
x:Class="XamlDemo.Controls.UI.FontInherit"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.Controls.UI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
FontSize="100">
<Grid Background="Transparent">
<StackPanel Margin="120 0 0 0">
<!--
演示如何繼承父輩的 Font 相關的信息
Font 相關的設置來自 Windows.UI.Xaml.Controls.Control
-->
<!--
繼承了 Page 的關於 Font 的設置
-->
<TextBlock Text="FontSize = 100" />
<UserControl FontSize="50">
<!--
繼承了 UserControl 的關於 Font 的設置
-->
<TextBlock Text="FontSize = 50" />
</UserControl>
</StackPanel>
</Grid>
</Page>
2、演示 Style
Controls/UI/Style.xaml
<Page
x:Class="XamlDemo.Controls.UI.Style"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.Controls.UI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Name="root" Background="Transparent">
<!--
注:
、在 Grid.Resources 指定的資源,其作用域僅在 Grid 之內,全局資源需要在 App.xaml 中配置
、Grid.Resources 等非全局資源也是支持 ResourceDictionary 的
-->
<Grid.Resources>
<!--
Style - 樣式
x:Key - 標識(不指定此值,則樣式會應用於所有 TargetType 所指定的類型)
TargetType - 目標對象類型
BasedOn - 指定當前樣式的父樣式(此樣式會繼承指定的父樣式)
Setter - 屬性設置器
Property - 需要設置的屬性名稱
Value - 需要設置的屬性值
-->
<Style x:Key="MyTextStyle" TargetType="TextBox">
<Setter Property="FontSize" Value="24"/>
<Setter Property="Foreground" Value="#0000FF"/>
</Style>
<Style x:Key="MyTextStyle2" TargetType="TextBox">
<Setter Property="FontSize" Value="24"/>
<Setter Property="Foreground" Value="#FF0000"/>
</Style>
<Style TargetType="TextBox" BasedOn="{StaticResource MyTextStyle}">
<Setter Property="TextAlignment" Value="Center"/>
</Style>
</Grid.Resources>
<StackPanel Margin="120 0 0 0">
<!--通過指定樣式資源,修改 FrameworkElement 的樣式(Style 屬性來自 FrameworkElement)-->
<TextBox Name="txtStyleDemo" Text="我是 TextBox" Margin="5" Style="{StaticResource MyTextStyle}" />
<!--隱式樣式(即全局樣式,即樣式資源中未指定 key 的樣式)的應用-->
<TextBox Text="我是 TextBox" Margin="5" />
<!--動態改變 FrameworkElement 的樣式-->
<Button Name="btnChangeStyle" Content="改變樣式" Click="btnChangeStyle_Click_1" />
</StackPanel>
</Grid>
</Page>
Controls/UI/Style.xaml.cs
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace XamlDemo.Controls.UI
{
public sealed partial class Style : Page
{
public Style()
{
this.InitializeComponent();
}
private void btnChangeStyle_Click_1(object sender, RoutedEventArgs e)
{
// 獲取 Application 中的資源
// (Windows.UI.Xaml.Style)Application.Current.Resources["myStyle"];
// 獲取 root 內的資源
txtStyleDemo.Style = (Windows.UI.Xaml.Style)root.Resources["MyTextStyle2"];
}
}
}
3、演示 ControlTemplate
Controls/UI/ControlTemplate.xaml
<Page
x:Class="XamlDemo.Controls.UI.ControlTemplate"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.Controls.UI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Name="root" Background="Transparent">
<!--
注:
、在 Grid.Resources 指定的資源,其作用域僅在 Grid 之內,全局資源需要在 App.xaml 中配置
、Grid.Resources 等非全局資源也是支持 ResourceDictionary 的
-->
<Grid.Resources>
<!--
ControlTemplate - 控件模板
x:Key - 標識
TargetType - 目標對象類型
ContentPresenter - 用於顯示 ContentControl 中的 Content
TemplateBinding - 模板綁定
-->
<ControlTemplate x:Key="MyControlTemplate" TargetType="Button">
<Border BorderBrush="Red" BorderThickness="1">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Right" Foreground="Red" />
</Grid>
</Border>
</ControlTemplate>
<ControlTemplate x:Key="MyControlTemplate2" TargetType="Button">
<Border BorderBrush="Red" BorderThickness="1">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Right" Foreground="Blue" />
</Grid>
</Border>
</ControlTemplate>
<!--在 Style 內配置 ControlTemplate-->
<Style x:Key="MyStyle" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border BorderBrush="Red" BorderThickness="1">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Right" Foreground="Red" />
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources>
<StackPanel Margin="120 0 0 0">
<!--通過指定控件模板資源,修改 Control 的模板(Template 屬性來自 Control)-->
<Button Name="btnControlTemplateDemo" Width="300" Margin="5" Content="我是 Button" Background="Yellow" Template="{StaticResource MyControlTemplate}" />
<!--通過內聯控件模板,修改 Control 的模板-->
<Button Width="300" Margin="5" Content="我是 Button">
<Button.Template>
<ControlTemplate>
<Border BorderBrush="Red" BorderThickness="1">
<Grid Background="Yellow">
<ContentPresenter HorizontalAlignment="Right" Foreground="Red" />
</Grid>
</Border>
</ControlTemplate>
</Button.Template>
</Button>
<!--在 Style 內配置 ControlTemplate-->
<Button Width="300" Margin="5" Content="我是 Button" Background="Yellow" Style="{StaticResource MyStyle}" />
<!--動態改變 Control 的模板-->
<Button Name="btnChangeControlTemplate" Content="改變控件模板" Click="btnChangeControlTemplate_Click_1" />
</StackPanel>
</Grid>
</Page>
Controls/UI/ControlTemplate.xaml.cs
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace XamlDemo.Controls.UI
{
public sealed partial class ControlTemplate : Page
{
public ControlTemplate()
{
this.InitializeComponent();
}
private void btnChangeControlTemplate_Click_1(object sender, RoutedEventArgs e)
{
// 獲取 Application 中的資源
// (Windows.UI.Xaml.Style)Application.Current.Resources["MyControlTemplate"];
// 獲取 root 內的資源
btnControlTemplateDemo.Template = (Windows.UI.Xaml.Controls.ControlTemplate)root.Resources["MyControlTemplate2"];
}
}
}
4、演示如何使用系統內置的樣式資源
Controls/UI/SystemResource.xaml
<Page
x:Class="XamlDemo.Controls.UI.SystemResource"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.Controls.UI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="Transparent">
<StackPanel Margin="120 0 0 0">
<!--
有 n 多的系統資源可用,以下舉幾個例子
注:可以在 Visual Studio 中枚舉出系統資源
-->
<Border Padding="12,4,12,4"
BorderThickness="{StaticResource ButtonBorderThemeThickness}"
BorderBrush="{StaticResource ButtonBorderThemeBrush}"
Background="{StaticResource ButtonBackgroundThemeBrush}">
<TextBlock Text="我是一個長得像 Button 的 TextBlock" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="SemiBold"
FontFamily="{StaticResource ContentControlThemeFontFamily}"
FontSize="{StaticResource ControlContentThemeFontSize}"
Foreground="{StaticResource ButtonForegroundThemeBrush}" />
</Border>
<Button Content="我是一個 Button" Margin="0 10 0 0" />
</StackPanel>
</Grid>
</Page>
5、演示 VisualState 和 VisualStateManager 的應用
Controls/UI/VisualStateDemo.xaml
<Page
x:Class="XamlDemo.Controls.UI.VisualStateDemo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.Controls.UI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="Transparent">
<Grid.Resources>
<ControlTemplate x:Key="myControlTemplate" TargetType="Button">
<Grid>
<VisualStateManager.VisualStateGroups>
<!--
VisualStateGroup - 用於分組 VisualState
-->
<VisualStateGroup x:Name="CommonStates">
<!--
Normal - 正常狀態
注意:
、本例所列出的 VisualState 名稱都是 Button 控件擁有的,不同的控件的 VisualState 名稱和種類可能會
不一樣
、寫自定義控件時,需要通過 VisualStateManager.GoToState() 來轉換 VisualState
-->
<VisualState x:Name="Normal" />
<!--
Disabled - 無效狀態
-->
<VisualState x:Name="Disabled" />
<!--
PointerOver - 鼠標經過時的狀態
-->
<VisualState x:Name="PointerOver">
<Storyboard>
<ColorAnimation
Storyboard.TargetName="borderBrush"
Storyboard.TargetProperty="Color"
To="Green" />
</Storyboard>
</VisualState>
<!--
PointerOver - 鼠標按下時的狀態
-->
<VisualState x:Name="Pressed">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="grid">
<DiscreteObjectKeyFrame KeyTime="0:0:0.3" Value="{StaticResource ButtonPressedBackgroundThemeBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="contentPresenter">
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonPressedForegroundThemeBrush}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<!--
VisualTransition - VisualState 變化時的過渡效果
From - 變化前的 VisualState 的 Name
To - 變化後的 VisualState 的 Name
GeneratedDuration - 一個狀態變化到另一個狀態的所需時間
GeneratedEasingFunction - 一個狀態變化到另一個狀態的緩動效果
-->
<VisualStateGroup.Transitions>
<VisualTransition To="PointerOver" GeneratedDuration="0:0:1">
<VisualTransition.GeneratedEasingFunction>
<ElasticEase EasingMode="EaseInOut" />
</VisualTransition.GeneratedEasingFunction>
</VisualTransition>
</VisualStateGroup.Transitions>
</VisualStateGroup>
<VisualStateGroup x:Name="FocusStates">
<!--
Focused - 獲取到焦點
-->
<VisualState x:Name="Focused" />
<!--
Unfocused - 失去焦點
-->
<VisualState x:Name="Unfocused"/>
<!--
PointerFocused - 通過指針獲取到焦點
-->
<VisualState x:Name="PointerFocused"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border x:Name="border" BorderThickness="10">
<Border.BorderBrush>
<SolidColorBrush x:Name="borderBrush" Color="Red" />
</Border.BorderBrush>
<Grid Name="grid" Background="{TemplateBinding Background}" Width="500" Height="200">
<ContentPresenter Name="contentPresenter" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="24.667"
Foreground="{TemplateBinding Foreground}" />
</Grid>
</Border>
</Grid>
</ControlTemplate>
</Grid.Resources>
<StackPanel Margin="120 0 0 0">
<Button Name="btnDemo" Content="我是 Button(用於演示 VisualState)" Margin="5" Background="Blue" Foreground="White" Template="{StaticResource myControlTemplate}" />
<Button Name="btnVisualStateManager" Content="將上面的按鈕的 VisualState 轉到 PointerOver" Click="btnVisualStateManager_Click_1" Margin="5" />
</StackPanel>
</Grid>
</Page>
Controls/UI/VisualStateDemo.xaml.cs
/*
* 演示 VisualState 和 VisualStateManager 的應用
*/
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace XamlDemo.Controls.UI
{
public sealed partial class VisualStateDemo : Page
{
public VisualStateDemo()
{
this.InitializeComponent();
}
private void btnVisualStateManager_Click_1(object sender, RoutedEventArgs e)
{
/*
* bool GoToState(Control control, string stateName, bool useTransitions) - 轉換 VisualState
* control - 需要轉換 VisualState 的控件
* stateName - 目標 VisualState 的名稱
* useTransitions - 是否使用 VisualTransition 進行過渡
*/
// 將 VisualState 轉到指定的狀態
VisualStateManager.GoToState(btnDemo, "PointerOver", true);
}
}
}
OK
[源碼下載]:http://files.cnblogs.com/webabcd/Windows8.rar