快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

黄金城vip贵宾会:WPF的Page介绍及Page之间的链接使用示例



WPF中的Page比拟Window来说加倍的精简,由于他没有供给一个Show或者是Hide的措施,而是经由过程链接的要领进行页面切换。此外,一样平常来说Page不设置自身的大年夜小,由于页面的尺寸由包孕它的宿主窗体来抉择的。假如设置了页面的Width和Height大年夜小,假如宿主的大年夜小小于页面的,则页面会被裁剪;假如宿主的大年夜小大年夜于页面的,则页面会居中显示。同时页面可以设置WindowWidth和WindowHeight以及WindowTitle来设置宿主的宽度、高度、标题属性。

先看个例子:

NavigationWindow win = new NavigationWindow();

//未设置大年夜小//win.Content = new Page1();

//宿主大年夜小大年夜于Page尺寸//win.Content = new Page1(300,300,500,500);

//宿主大年夜小小于Page尺寸win.Content = new Page1(500, 500, 300, 300);

win.Show();

例子中设置了三种不合环境下页面和宿主窗体之间的大年夜小关系,看到的三种环境如下

三张图片分手为,未对窗体进行大年夜小设置,宿主大年夜于页面,宿主小于页面.

下面先容下Page页面的宿主问题:

Page的宿主包括浏览器,导航窗口(NavigationWindow)和Frame,上例子中已经应用了NavigationWindow。后两种均为WPF供给的Page宿主窗口,供给了从一个Page导航到另一个Page的功能,同时可以记录历史导航,以及一系列的导航事故。此中NavigationWindow承袭自Window,以是在外不雅上与通俗的窗口最大年夜的差别是多了一个导航对象栏,不过可以经由过程设置ShowsNavigationUI属性节制是否显示。

NavigationWindow为顶级窗口,不容许嵌入到其他的元素中。而Frame则为轻量级,可以嵌入到其他元素中,如NavigationWindow或者Page,以致Frame的嵌套。Frame默认没有导航栏,可以设置NavigationUIVisibility属性为Visible使其显示。

例子,如下例子在NavigationWindow中放置了一个Page,然后在Page中嵌套了一个Frame:

Page x:Class="WpfApplication4.Page1"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

mc:Ignorable="d"d:DesignHeight="300" d:DesignWidth="300"

Title="Page1">Border BorderBrush="Red" BorderThickness="2" Margin="2">

Grid>Grid.RowDefinitions>

RowDefinition>RowDefinition>RowDefinition>RowDefinition>

Grid.RowDefinitions>TextBlock Grid.Row="0" Text="该页面的宿主窗口是一个NavigationWindow"

HorizontalAlignment="Center" VerticalAlignment="Center">TextBlock>Frame Source="Page2.xaml" NavigationUIVisibility="Visible" Grid.Row="1">Frame>黄金城vip贵宾会

Grid>Border>

Page>

同时设置App中的StartUrl为Page,效果如下:

可以看到,最外层是拥有导航的NavigationWindow,而内层还嵌套一个拥有导航的Frame.

细心的童鞋会发明,在上例子中我们并没有添加NavigationWindow的代码,可为什么照样有了效果呢?这是由于当设置了StartUri的工具为Page而不是Window,WPF就会为该Page创建一个NavigationWindow。

下面开始先容Page之间的导航链接:

1.超链接(HyperLink)

HyperlinkClick="Hyperlink_Click_1">开始涉猎路由事故Hyperlink>

Hyperlink NavigateUri="Page4.xaml">开始涉猎路由事故Hyperlink>

private void Hyperlink_Click_1(object sender, RoutedEventArgs e)

{NavigationService.Navigate(new Uri("pack://application:,,,/Page4.xaml"));

}

上述代码应用了HyperLink的两种要领进行导航,一种是设置NavigateUri属性为目标页,另一种是应用NavigationService类的Navigate措施来进行导航页(当然,此措施不限于

HyperLink应用).

除了上述对照简单的应用外,HyperLink还可以在元素之间进行导航,例子如下:

Page x:Class="WpfApplication4.Page4"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

mc:Ignorable="d"d:DesignHeight="300" d:DesignWidth="300"

Title="Page4">

Grid>FlowDocumentReader>

FlowDocument>Paragraph x:Name="para" FontSize="24" Background="AliceBlue">

Figure Width="100" Height="100"HorizontalAnchor="ColumnRight" HorizontalOffset="-10" VerticalAnchor="ParagraphTop" VerticalOffset="-30">BlockUIContainer>

Image Source="bee.png"/>BlockUIContainer>

Figure>路由事故(Routed Event)

Paragra黄金城vip贵宾会ph>Section FontFamily="华文仿宋">

Paragraph>

黄蓉凝目看去,只见那两只玉蜂双翅上也都有字,那六个字也是如出一辙,右翅是“情谷底”,左翅是“我在绝”。黄蓉大年夜奇,暗想:“造物虽奇,也决造不出这样一批蜜蜂来之理。此中必有缘故。” ……Paragraph>

Paragraph>黄蓉不答,只是轻轻念着:“情谷底,我在绝。情谷底,我在绝。”她念了几遍,随即憬悟:“啊!那是‘我在绝情谷底’。是谁在绝情谷底啊?难道是襄儿?”心中怦怦乱跳……

Paragraph>Paragraph TextAlignment="Right">

——《神雕侠侣:第三十八回 存亡茫茫》Paragraph>

Section>Section LineHeight="25" FontSize="15">

Paragraph >这一段讲的是小龙女深陷绝情谷地,用花树上的细刺,在玉蜂翅上刺下‘我在绝情谷底’六字,渴望玉蜂飞上之后,能为人发明。结果蜂翅上的细字被周伯通发明,而给黄蓉隐约猜到了此中含义。本节内容包括:

Paragraph>List >

ListItem>Paragraph>

Hyperlink NavigateUri="Page4.xaml#first">-->

从玉蜂提及,回首.Net事故模型Hyperlink>

Paragraph>ListItem>

ListItem>Paragraph>

Hyperlink NavigateUri="Page4.xaml#second">什么是路由事故?

Hyperlink>Paragraph>

ListItem>ListItem>

Paragraph>CLR事故足够完美,为什么还必要路由事故?

Paragraph>ListItem>

ListItem>Paragraph>

言归正传,话路由事故Paragraph>

ListItem>ListItem>

Paragraph>路由事故的实例

Paragraph>ListItem>

List>Section>

Paragraph x:Name="first" FontSize="20" Background="AliceBlue"> .从玉蜂提及,回首.Net事故模型

Paragraph>Paragraph>

木木认识神雕侠侣的故事,于是他根据“玉蜂传信”这样一个故事,信手画下这样一幅有趣的图。Paragraph>

BlockUIContainer>Image Source="routedevent.jpg"/>

BlockUIContainer>Paragraph>

着实这一幅“玉黄金城vip贵宾会蜂传信图”暗合.Net的事故模型。小龙女是事故的宣布者,她宣布了事故“我在绝情谷底”;老顽童和黄蓉是事故的订阅者,不过老顽童并没有处置惩罚该事故,而黄蓉处置惩罚了事故,隐约能猜出此中含义;至于可怜的小杨过,则根本没有订阅事故,只是苦苦念叨“龙儿,龙儿,你在哪儿……”;而玉蜂恰是通报信息的事故。事故,事故的宣布者和事故的订阅者构成了.Net事故模型的三个角色。在.Net傍边,一个事故是用关键字event来表示的。如下代码所示:Paragraph>

Paragraph xml:space="preserve" Background="#88888888">public delegate void WhiteBee(string param); //声清楚明了玉蜂的委托

// 小龙女类class XiaoLongnv

{public event WhiteBee WhiteBeeEvent;//玉蜂事故

public void OnFlyBee(){

Console.WriteLine("小龙女在谷底日复一日地放着玉蜂,盼望杨过有一天黄金城vip贵宾会能看到.....");WhiteBeeEvent(msg);

}private string msg = "我在绝情谷底";

}

// 老顽童类class LaoWantong

{public void ProcessBeeLetter(string msg)

{Console.WriteLine("老顽童:小蜜蜂、小蜜蜂,别跑");

}}

// 黄蓉类

class Huangrong{

public void ProcessBeeLetter(string msg){

Console.WriteLine("黄蓉:\"{0}\",莫非......",msg);}

}

// 杨过类class YangGuo

{public void ProcessBeeLetter(string msg)

{Console.WriteLine("杨过:\"{0}\",我必然会找她!", msg);

}public void Sign()

{Console.WriteLine("杨过太息:龙儿,你在哪儿....");

}}

static void Main(string[] args){

// 第一步 人物先容XiaoLongnv longnv = new XiaoLongnv();//小龙女

LaoWantong wantong = new LaoWantong();//老顽童Huangrong rong = new Huangrong();//黄蓉

YangGuo guo = new YangGuo();//杨过

// 第二步 订阅事故,唯独没有订阅杨过的ProcessBeeLetter;longnv.WhiteBeeEvent += wantong.ProcessBeeLetter;

longnv.WhiteBeeEvent += rong.ProcessBeeLetter;// longnv.WhiteBeeEvent += guo.ProcessBeeLetter; //杨过是没有订阅小龙女的玉蜂事故

// 第三步 小龙女玉蜂传信

longnv.OnFlyBee();

// 第四步 杨过太息guo.Sign();

}Paragraph>

Paragraph x:Name="second" FontSize="20" Background="AliceBlue"> .什么是路由事故?

Paragraph>Paragraph>

什么是路由事故呢?木木很快查看了一下MSDN,MSDN从功能和实现两种视角给出了路由事故的定义。Paragraph>

Paragraph>Functional definition: A routed event is a type of event that can invoke handlers on multiple listeners in an element tree, rather than just on the object that raised the event.

Paragraph>Paragraph>

Implementation definition: A routed event is a CLR event that is backed by an instance of the RoutedEvent class and is processed by the Windows Presentation Foundation (WPF) event system.Paragraph>

Paragraph>虽然木木现在英语功底已经进步了很多,然则这两个定义照样让他看得一头雾水。看来必须得找个例子有点感性的熟识(以大年夜家都异常认识的Button的Click事故为例,该事故是个路由事故,可以经由过程Reflector查看ButtonBase的源码)。

Paragraph>FlowDocument>

FlowDocumentReader>Grid>

Page>

上述代码较长(摘抄自 WPF葵花宝典),应用了一个FlowDocumentReader文本涉猎控件,在此中有多个段落(Paragraph),同时在HyperLink中设置了NavigateUri,可以看到

属性值除了包孕xaml名称之外,还包孕了"#"这样的符号,没错这个便是类似于Html中的,本页之间的超链,经由过程指定"#元素名称",在点击HyperLink之后,就可以导航到Name

为所指定的元素。

导航对象栏:

上图中黄金城vip贵宾会的功能是不是很方便呢,这个在WPF中也很轻易的实现.

首先,同样的设置一个Page为肇端页(WPF会自动添加一个NavigationWindow),然后放置一个按钮按钮用于跳转,点击之后你会神奇的发明,点击导航栏的下拉会显示之前造访的页面和当前页面的链接.

不知道细心的童鞋会思虑一个问题,这个链接的文本是怎么获得的呢,问题问的好,这个链接的文本可以来自多个属性,然则终极却是有一个会被应用,优先级如下:

JournalEntry.Name(在Page中设置,一个附加属性)>Page.Title>Page.WindowTitle。

当然,点击对象栏的提高和退却撤退,也可以导航到之前造访的页面去。除了导航栏可以实现提高退却撤退,在其他的按钮中也是可以的,代码如下:

Button Content="退却撤退" Command="NavigationCommands.BrowseBack">Button>

Button Content="提高" Command="NavigationCommands.BrowseForward">Button>

只需指定按钮的Command属性为对应的敕令即可,是不是很简单呢。

转自:http://www.cnblogs.com/ListenFly/archive/2013/02/24/2923474.html

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: