微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

稳扎稳打Silverlight(34) - 3.0控件之Frame, Page, Label, DescriptionViewer, ValidationSummary

[索引页]
[源码下载]


稳扎稳打Silverlight(34) - 3.0控件之Frame,Page,Label,DescriptionViewer,ValidationSummary


作者:webabcd


介绍
Silverlight 3.0 控件一览:
  • Frame - 与 Page 控件结合使用,从而实现导航功能(可以由此实现 Deep Linking)
  • Page - 与 Frame 控件结合使用
  • Label - 比 TextBlock 功能多一些,可以用来对错误的验证信息做提示
  • DescriptionViewer - 鼠标经过时的提示信息 
  • ValidationSummary - 汇总显示验证错误的信息 


在线DEMO
http://www.voidcn.com/article/p-boakcggz-tq.html

示例
1、Frame 控件的使用演示。其可以导航 Page,可以做url映射
Frame.xaml
<navigation:Page x:Class="Silverlight30.Control.Frame"    
                     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"    
                     xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation"
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                     mc:Ignorable="d"
                     d:DesignWidth="640" d:DesignHeight="480"
                     Title="Frame Page">
        <Grid x:Name="LayoutRoot">
                
                <StackPanel HorizontalAlignment="Left">
                        <Border BorderBrush="Gray" BorderThickness="3" Padding="10">
                        
                                <!--
                                        Frame - 与 Page 控件结合使用,从而实现导航功能(可以由此实现 Deep Linking)
                                        Source - 需要在 Frame 中显示的 Page 的地址
                                        JournalOwnership - 导航日志的记录方式 [System.Windows.Navigation.JournalOwnership 枚举]
                                                Automatic - 如果 Frame 是最顶级的 Frame,则在浏览器端记录导航日志,否则由此 Frame 自行记录
                                                OwnsJournal - 自行记录
                                                UsesParentJournal - 当 Frame 是最顶级的 Frame 时,由浏览器记录。如果是非顶级 Frame 的话,则会抛出异常
                                        UriMapper - Uri 映射器。可以在其内编辑映射规则
                                        UriMapping - 具体的映射规则(在 System.Windows.Navigation 命名空间下)
                                                如本例就是把类似 Silverlight30TestPage.aspx#/Control/PageDemo 的地址映射到类似 Silverlight30TestPage.aspx#/Control/PageDemo.xaml 的地址
                                -->                        
                                <navigation:Frame x:Name="frame" Source="/Control/PageDemo" JournalOwnership="OwnsJournal">
                                        <navigation:Frame.Content>
                                                <TextBlock Text="我是 Frame 的 Content" />
                                        </navigation:Frame.Content>
                                        <navigation:Frame.UriMapper>
                                                <uriMapper:UriMapper>
                                                        <uriMapper:UriMapping Uri="/{address}" MappedUri="/{address}.xaml"/>
                                                </uriMapper:UriMapper>
                                        </navigation:Frame.UriMapper>
                                </navigation:Frame>
                        </Border>
                        <Button x:Name="navigatetoPageDemo" Content="链接到 PageDemo" Click="navigatetoPageDemo_Click" Width="200" />
                        <Button x:Name="navigatetoPageDemo2" Content="链接到 PageDemo2" Click="navigatetoPageDemo2_Click" Width="200" />
                </StackPanel>
                
        </Grid>
</navigation:Page>
 
Frame.xaml.cs 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.Windows.Navigation;


namespace Silverlight30.Control

{

         public partial class Frame : Page

        {

                 public Frame()

                {

                        InitializeComponent();

                }


                 private void navigatetoPageDemo_Click( object sender,RoutedEventArgs e)

                {

                         /*

                         * Navigate() - 导航到指定的 Uri 地址

                         * CanGoBack - 是否可后退

                         * CanGoForward - 是否可前进

                         * GoBack() - 后退

                         * GoForward() - 前进

                         */

                        

                        frame.Navigate( new Uri( "/Control/PageDemo",UriKind.Relative));

                }


                 private void navigatetoPageDemo2_Click( object sender,RoutedEventArgs e)

                {

                        frame.Navigate( new Uri( "/Control/PageDemo2",UriKind.Relative));

                }

        }

}
 
 
2、Page 控件的使用演示。在 Page 间做导航,以及之间的参数传递
PageDemo.xaml
<navigation:Page x:Class="Silverlight30.Control.PageDemo"    
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                     mc:Ignorable="d"
                     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
                     d:DesignWidth="640" d:DesignHeight="480"
                     Title="PageDemo Page">
        <Grid x:Name="LayoutRoot">
                <StackPanel>
                        <TextBlock Text="我是 PageDemo" />
                        <Button Content="链接到 PageDemo2" Click="Button_Click" />
                        <TextBlock x:Name="lblMsg" />
                </StackPanel>
        </Grid>
</navigation:Page>
 
PageDemo.xaml.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.Windows.Navigation;


namespace Silverlight30.Control

{

         public partial class PageDemo : Page

        {

                 public PageDemo()

                {

                        InitializeComponent();

                }


                 // 当用户导航至此控件时,会调用如下方法

                 protected override void OnNavigatedTo(NavigationEventArgs e)

                {

                         /*

                         * NavigationService - 在 Page 控件中做导航的类

                         * NavigationContext - 导航的上下文,其 QueryString 属性可用于获取导航参数

                         * NavigationEventArgs.Uri - 当前导航地址

                         */


                        lblMsg.Text += "当前的导航地址:" + e.Uri.ToString() + "\n";


                         if ( this.NavigationContext.QueryString.ContainsKey( "param1"))

                                lblMsg.Text += "参数1:" + NavigationContext.QueryString[ "param1"] + "\n";

                         if ( this.NavigationContext.QueryString.ContainsKey( "param2"))

                                lblMsg.Text += "参数2:" + NavigationContext.QueryString[ "param2"];

                }


                 private void Button_Click( object sender,RoutedEventArgs e)

                {

                         if (((System.Windows.Controls.Frame) this.Parent).UriMapper == null)

                                NavigationService.Navigate( new Uri( "/Control/PageDemo2.xaml",UriKind.Relative));

                         else

                                NavigationService.Navigate( new Uri( "/Control/PageDemo2",UriKind.Relative));

                }

        }

}
 
PageDemo2.xaml
<navigation:Page x:Class="Silverlight30.Control.PageDemo2"    
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                     mc:Ignorable="d"
                     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
                     d:DesignWidth="640" d:DesignHeight="480"
                     Title="PageDemo2 Page">
        <Grid x:Name="LayoutRoot">
                <StackPanel>
                        <TextBlock Text="我是 PageDemo2" />
                        <Button Content="链接到 PageDemo" Click="Button_Click" />
                </StackPanel>
        </Grid>
</navigation:Page>
 
PageDemo2.xaml.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.Windows.Navigation;


namespace Silverlight30.Control

{

         public partial class PageDemo2 : Page

        {

                 public PageDemo2()

                {

                        InitializeComponent();

                }


                 private void Button_Click( object sender,RoutedEventArgs e)

                {

                         if (((System.Windows.Controls.Frame) this.Parent).UriMapper == null)

                                NavigationService.Navigate( new Uri( "/Control/PageDemo.xaml?param1=param1¶m2=param2",UriKind.Relative));

                         else

                                NavigationService.Navigate( new Uri( "/Control/PageDemo?param1=param1¶m2=param2",UriKind.Relative));

                }

        }

}
 
 
3、演示 Label 控件
Label.xaml
<navigation:Page xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input"    x:Class="Silverlight30.Control.Label"    
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                     mc:Ignorable="d"
                     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
                     d:DesignWidth="640" d:DesignHeight="480"
                     Title="Label Page">
        <Grid x:Name="LayoutRoot">
                <StackPanel>
                
                        <!--Label 控件的演示-->
                        <dataInput:Label Content="我是 Label" Foreground="White">
                                <dataInput:Label.Background>
                                        <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                                                <GradientStop Color="Red" Offset="0" />
                                                <GradientStop Color="Green" Offset="0.5" />
                                                <GradientStop Color="Blue" Offset="1" />
                                        </LinearGradientBrush>
                                </dataInput:Label.Background>
                        </dataInput:Label>

                </StackPanel>
        </Grid>
</navigation:Page>
 
 
4、演示 DescriptionViewer 控件
DescriptionViewer.xaml
<navigation:Page xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input"    x:Class="Silverlight30.Control.DescriptionViewer"    
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                     mc:Ignorable="d"
                     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
                     d:DesignWidth="640" d:DesignHeight="480"
                     Title="DescriptionViewer Page">
        <Grid x:Name="LayoutRoot">
                <StackPanel Margin="10">
                
                        <!--
                                Description - 鼠标经过时的提示信息
                                GlyphTemplate - 显示提示信息的图标部分的外观
                        -->
                        <dataInput:DescriptionViewer Description="设置 DescriptionViewer 的 Description 属性" />
                        
                </StackPanel>
        </Grid>
</navigation:Page>
 
 
5、ValidationSummary,DescriptionViewer 的结合使用,实现数据验证的 UI 部分。验证的逻辑部分由 System.ComponentModel.DataAnnotations 实现
EmployeeModel.cs

/*

* Silverlight 支持 System.ComponentModel.DataAnnotations 方式的数据验证。同样支持该数据验证的还有 Dynamic Data,asp.net mvc 2

*/


using System;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Ink;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;


using System.ComponentModel.DataAnnotations;


namespace Silverlight30.Model

{

         public class EmployeeModel

        {

                 private string _name;

                [display(Name = "名字",Description = "必填字段")]

                [required(ErrorMessage= "名字必填")]

                 public string Name

                {

                        get { return _name; }

                        set

                        {

                                 /*

                                 * Validator.Validateproperty() - 用于决定指定的属性是否通过了验证(根据属性的 DataAnnotations 的 Attribute 做判断)。以及当其没有通过验证时,抛出异常

                                 */

                                Validator.ValidateProperty(value,new ValidationContext( this,null,null) { MemberName = "Name" });

                                _name = value;

                        }

                }


                 private double _salary;

                [display(Name= "薪水",Description= "薪水介于 0 - 10000 之间")]

                [Range(0,10000)]

                 public double Salary

                {

                        get { return _salary; }

                        set

                        {

                                Validator.ValidateProperty(value,null) { MemberName = "Salary" });

                                _salary = value;

                        }

                }


                 public DateTime DateOfBirty { get; set; }

        }

}
 
ValidationSummary.xaml
<navigation:Page xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input"    x:Class="Silverlight30.Control.ValidationSummary"    
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                     mc:Ignorable="d"
                     xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
                     d:DesignWidth="640" d:DesignHeight="480"
                     Title="ValidationSummary Page">
        <Grid x:Name="LayoutRoot">
                <StackPanel>

                        <StackPanel x:Name="employee">
                                <StackPanel Orientation="Horizontal">

                                        <!--
                                                Label - 可以用来对错误的验证信息做提示认为将文本变为红色
                                                DescriptionViewer - 其 Description 属性可以自动绑定到指定属性display 特性上
                                                Target - 关联的对象,以对相应的元数据(Metadata)做提示
                                                PropertyPath - 所关联的对象的指定的字段
                                        -->

                                        <dataInput:Label Target="{Binding ElementName=name}" />
                                        <TextBox x:Name="name" Text="{Binding Name,Mode=TwoWay,NotifyOnValidationError=True,ValidatesOnExceptions=True}" />
                                        <dataInput:DescriptionViewer Target="{Binding ElementName=employee}" PropertyPath="Name" />
                                        
                                </StackPanel>
                                <StackPanel Orientation="Horizontal">
                                
                                        <dataInput:Label Target="{Binding ElementName=salary}" />
                                        <TextBox x:Name="salary" Text="{Binding Salary,ValidatesOnExceptions=True}" />
                                        <dataInput:DescriptionViewer Target="{Binding ElementName=employee}" PropertyPath="Salary" />
                                        
                                </StackPanel>
                        </StackPanel>

                        <!--
                                ValidationSummary - 汇总显示验证错误的信息
                                SummaryListBoxStyle - 显示汇总错误信息的 ListBox 控件的样式
                        -->
                        <dataInput:ValidationSummary />

                </StackPanel>
        </Grid>
</navigation:Page>
 
ValidationSummary.xaml.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.Windows.Navigation;


using Silverlight30.Model;


namespace Silverlight30.Control

{

         public partial class ValidationSummary : Page

        {

                 public ValidationSummary()

                {

                        InitializeComponent();


                         this.Loaded += new RoutedEventHandler(ValidationSummary_Loaded);

                }


                 void ValidationSummary_Loaded( object sender,RoutedEventArgs e)

                {

                         this.DataContext = new EmployeeModel() { Name = "webabcd",Salary = 0 };

                }

        }

}
 
 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐