posts - 615, comments - 10492, trackbacks - 594, articles - 0
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[源码下载]


重新想象 Windows 8.1 Store Apps (78) - 控件增强: ScrollViewer, FlipView, Popup



作者:webabcd


介绍
重新想象 Windows 8.1 Store Apps 之控件增强

  • ScrollViewer - 滚动视图控件的增强
  • FlipView - 滑动视图控件的增强
  • Popup - 弹出框控件的增强



示例
1、演示 ScrollViewer 的新特性
ScrollViewerDemo.xaml

<Page
    x:Class="Windows81.Controls.ScrollViewerDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows81.Controls"
    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">

            <TextBlock Name="lblMsg" />

            <!--
                ScrollViewer - 滚动视图控件,新增功能如下
                    TopHeader - 水平可滚动,垂直不动
                    LeftHeader - 垂直可滚动,水平不动
                    TopLeftHeader - 固定不动
            
                注:如果要使用 TopHeader, LeftHeader, TopLeftHeader 则 ScrollViewer.Content 中的内容必须是 HorizontalAlignment="Left" VerticalAlignment="Top"
            -->
            <ScrollViewer Name="scrollViewer" Width="400" Height="400" Margin="0 10 0 0"
                          HorizontalAlignment="Left" VerticalAlignment="Top"
                          HorizontalScrollMode="Enabled" VerticalScrollMode="Enabled"
                          HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible">
                
                <ScrollViewer.Content>
                    <Image Source="/Assets/Son.jpg" Width="1000" HorizontalAlignment="Left" VerticalAlignment="Top" />
                </ScrollViewer.Content>
                
                <ScrollViewer.TopHeader>
                    <TextBlock Text="TopHeader" />
                </ScrollViewer.TopHeader>
                
                <ScrollViewer.LeftHeader>
                    <TextBlock Text="LeftHeader" />
                </ScrollViewer.LeftHeader>
                
                <ScrollViewer.TopLeftHeader>
                    <TextBlock Text="TopLeftHeader" />
                </ScrollViewer.TopLeftHeader>
    
            </ScrollViewer>
            
            <Button Name="btnChangeView" Content="Change View" Click="btnChangeView_Click" Margin="0 10 0 0" />

        </StackPanel>
    </Grid>
</Page>

ScrollViewerDemo.xaml.cs

/*
 * ScrollViewer - 滚动视图控件
 * 
 * 
 * 关于 ScrollViewer 的基础请参见:
 * http://www.cnblogs.com/webabcd/archive/2013/03/07/2947313.html
 * http://www.cnblogs.com/webabcd/archive/2013/03/11/2953402.html
 */

using Windows.UI.Xaml.Controls;

namespace Windows81.Controls
{
    public sealed partial class ScrollViewerDemo : Page
    {
        public ScrollViewerDemo()
        {
            this.InitializeComponent();
        }

        private void btnChangeView_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            // ScrollToHorizontalOffset 和 ScrollToVerticalOffset 都舍弃了
            // ChangeView() - 可以设置水平平移,垂直平移和缩放比例,并且可以指定是否使用动画过渡
            bool result = scrollViewer.ChangeView(100f, 100f, 1f, false);
        }
    }
}

 

2、演示 FlipView 的新特性
FlipViewDemo.xaml

<Page
    x:Class="Windows81.Controls.FlipViewDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows81.Controls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <!--
        本例是一个 FlipView 和 ListBox(用于显示小点点)联动的 Demo
    
        FlipView 在 win8.1 中新增了一个属性 UseTouchAnimationsForAllNavigation,将其设置为 true 可以保证无论是基于触控的模式,还是基于按钮的模式,还是编程的模式,FlipView 都会有一致的动画体验
    -->

    <!--定义 ListBox(用于显示小点点)的样式-->
    <Page.Resources>
        <Style x:Key="ItemContainerStyle" TargetType="ListBoxItem">
            <Setter Property="Width" Value="32"/>
            <Setter Property="Height" Value="20"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <Grid Background="{TemplateBinding Background}">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates" >
                                    <VisualState x:Name="Normal" />
                                    <VisualState x:Name="PointerOver"/>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="SelectionStates" >
                                    <VisualState x:Name="Unselected" />
                                    <VisualState x:Name="Selected">
                                        <Storyboard>
                                            <ColorAnimation Storyboard.TargetName="fillColor" Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)" BeginTime="00:00:00" Duration="0" To="#FF58CC0C" />
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="SelectedUnfocused">
                                        <Storyboard>
                                            <ColorAnimation Storyboard.TargetName="fillColor" Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)" BeginTime="00:00:00" Duration="0"  To="#FF58CC0C" />
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="SelectedPressed">
                                        <Storyboard>
                                            <ColorAnimation Storyboard.TargetName="fillColor" Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)" BeginTime="00:00:00" Duration="0"  To="#FF58CC0C" />
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="SelectedPointerOver">
                                        <Storyboard>
                                            <ColorAnimation Storyboard.TargetName="fillColor" Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)" BeginTime="00:00:00" Duration="0"  To="#FF58CC0C" />
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Rectangle x:Name="fillColor" IsHitTestVisible="False" Width="32" Height="20" Fill="#FFBFBFBF" Margin="5,0"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <Style x:Key="ListBoxStyle" TargetType="ListBox">
            <Setter Property="Foreground" Value="{StaticResource ListBoxForegroundThemeBrush}"/>
            <Setter Property="Background" Value="{StaticResource ListBoxBackgroundThemeBrush}"/>
            <Setter Property="BorderBrush" Value="{StaticResource ListBoxBorderThemeBrush}"/>
            <Setter Property="BorderThickness" Value="{StaticResource ListBoxBorderThemeThickness}"/>
            <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
            <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
            <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Disabled"/>
            <Setter Property="ScrollViewer.IsHorizontalRailEnabled" Value="True"/>
            <Setter Property="ScrollViewer.VerticalScrollMode" Value="Enabled"/>
            <Setter Property="ScrollViewer.IsVerticalRailEnabled" Value="True"/>
            <Setter Property="ScrollViewer.ZoomMode" Value="Disabled"/>
            <Setter Property="IsTabStop" Value="False"/>
            <Setter Property="TabNavigation" Value="Once"/>
            <Setter Property="FontFamily" Value="{StaticResource ContentControlThemeFontFamily}"/>
            <Setter Property="FontSize" Value="{StaticResource ControlContentThemeFontSize}"/>
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel/>
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBox">
                        <Border x:Name="LayoutRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="Disabled"/>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="FocusStates">
                                    <VisualState x:Name="Focused"/>
                                    <VisualState x:Name="Unfocused"/>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <ScrollViewer x:Name="ScrollViewer" HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}" HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}" IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}" IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}" Padding="{TemplateBinding Padding}" TabNavigation="{TemplateBinding TabNavigation}" VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}" VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}" ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}">
                                <ItemsPresenter/>
                            </ScrollViewer>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Page.Resources>
    
    <Grid Background="Transparent">
        <StackPanel Margin="120 0 0 0">

            <!--
                FlipView - 滑动视图控件
                    UseTouchAnimationsForAllNavigation - true 代表无论是基于触控的模式,还是基于按钮的模式,还是编程的模式,FlipView 都会有一致的动画体验
            -->
            <FlipView x:Name="flipView" Width="480" Height="270" BorderBrush="Black" BorderThickness="1" UseTouchAnimationsForAllNavigation="True">
                <FlipView.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Image Width="480" Height="270" Source="{Binding Image}" Stretch="UniformToFill"/>
                            <Border Background="#A5000000" Height="80" VerticalAlignment="Bottom">
                                <TextBlock Text="{Binding Title}" FontSize="26.667" Foreground="#CCFFFFFF" Padding="15,20"/>
                            </Border>
                        </Grid>
                    </DataTemplate>
                </FlipView.ItemTemplate>
                <FlipView.ItemsPanel>
                    <ItemsPanelTemplate>
                        <VirtualizingStackPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </FlipView.ItemsPanel>
            </FlipView>

            <ListBox x:Name="listBox" Width="478" Height="40" Background="#A5000000" HorizontalAlignment="Center" Margin="0,-5,0,0" 
                     SelectedItem="{Binding SelectedItem, ElementName=flipView, Mode=TwoWay}"
                     ItemContainerStyle="{StaticResource ItemContainerStyle}"
                     Style="{StaticResource ListBoxStyle}">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center"/>
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
            </ListBox>
            
        </StackPanel>
    </Grid>
</Page>

FlipViewDemo.xaml.cs

/*
 * FlipView - 滑动视图控件
 * FlipView 在 win8.1 中新增了一个属性 UseTouchAnimationsForAllNavigation,将其设置为 true 可以保证无论是基于触控的模式,还是基于按钮的模式,还是编程的模式,FlipView 都会有一致的动画体验
 * 
 * 提示:本例是一个 FlipView 和 ListBox(用于显示小点点)联动的 Demo
 * 
 * 关于 FlipView 的基础请参见:http://www.cnblogs.com/webabcd/archive/2013/01/21/2869167.html
 */

using System;
using System.Collections.ObjectModel;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
using Windows81.Common;

namespace Windows81.Controls
{
    public sealed partial class FlipViewDemo : Page
    {
        public FlipViewDemo()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            // 设置 FlipView 和 ListBox 的数据源
            var flipViewData = new FlipViewDataSource();
            flipView.ItemsSource = flipViewData.Items;
            listBox.ItemsSource = flipViewData.Items;
            listBox.SelectionChanged += listBox_SelectionChanged;
        }

        void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // 确保在按钮模式下,FlipView 能正确地显示箭头按钮
            flipView.Focus(Windows.UI.Xaml.FocusState.Pointer);
        }
    }


    // 用于提供数据
    public sealed class FlipViewDataSource : BindableBase
    {
        private static Uri _baseUri = new Uri("ms-appx:///");

        public FlipViewDataSource(String title, String picture)
        {
            this._title = title;
            this._picture = picture;
        }

        private string _title = string.Empty;
        public string Title
        {
            get { return this._title; }
            set { this.SetProperty(ref this._title, value); }
        }

        private Uri _image = null;
        private String _picture = null;
        public Uri Image
        {
            get
            {
                return new Uri(_baseUri, this._picture);
            }

            set
            {
                this._picture = null;
                this.SetProperty(ref this._image, value);
            }
        }

        private ObservableCollection<object> _items = new ObservableCollection<object>();
        public ObservableCollection<object> Items
        {
            get { return this._items; }
        }

        public FlipViewDataSource()
        {
            Items.Add(new FlipViewDataSource("aaa", "Assets/Son.jpg"));
            Items.Add(new FlipViewDataSource("bbb", "Assets/Son.jpg"));
            Items.Add(new FlipViewDataSource("ccc", "Assets/Son.jpg"));
            Items.Add(new FlipViewDataSource("ddd", "Assets/Son.jpg"));
            Items.Add(new FlipViewDataSource("eee", "Assets/Son.jpg"));
        }
    }
}


3、演示 Popup 的新特性
PopupDemo.xaml

<Page
    x:Class="Windows81.Controls.PopupDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows81.Controls"
    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">

            <Button Name="btnClose" Content="关闭全部 Popup" Click="btnClose_Click" />

            <Popup HorizontalOffset="0" VerticalOffset="50" IsLightDismissEnabled="False" IsOpen="True">
                <Popup.Child>
                    <Border BorderBrush="Red" BorderThickness="1" Background="Blue" Width="200" Height="200">
                        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
                            <TextBlock Text="我是 Popup" FontSize="24.667" HorizontalAlignment="Center" />
                        </StackPanel>
                    </Border>
                </Popup.Child>
            </Popup>

            <Popup HorizontalOffset="250" VerticalOffset="50" IsLightDismissEnabled="False" IsOpen="True">
                <Popup.Child>
                    <Border BorderBrush="Red" BorderThickness="1" Background="Blue" Width="200" Height="200">
                        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
                            <TextBlock Text="我是 Popup" FontSize="24.667" HorizontalAlignment="Center" />
                        </StackPanel>
                    </Border>
                </Popup.Child>
            </Popup>

        </StackPanel>
    </Grid>
</Page>

PopupDemo.xaml.cs

/*
 * Popup - 弹出框控件
 * 
 * 
 * 关于 Popup 的基础请参见:
 * http://www.cnblogs.com/webabcd/archive/2013/01/14/2859153.html
 */

using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;

namespace Windows81.Controls
{
    public sealed partial class PopupDemo : Page
    {
        public PopupDemo()
        {
            this.InitializeComponent();
        }

        private void btnClose_Click(object sender, RoutedEventArgs e)
        {
            // VisualTreeHelper 中新增了 GetOpenPopups() 方法,可以获取可视树中的全部 Popup 对象
            var popups = VisualTreeHelper.GetOpenPopups(Window.Current);
            foreach (var popup in popups)
            {
                popup.IsOpen = false;
            }
        }
    }
}



OK
[源码下载]