【转】页(page),用户控件(userControl),窗口(window)区别

欢迎加入BIM行业开发交流1群 群号:711844216

背景

大家在vs中新建wpf项目后,会发现在添加新建项时会出现下列三个选项
在这里插入图片描述
它们有什么区别呢?

区别:

  • 页:通常用于网页
  • 窗口:通常一个桌面app只有一个主窗口
  • 用户控件:控件需要被重复用时,比如在很多窗口中,用同一个日历控件

简而言之:一个主窗口可能存在多个用户控件,一个用户控件可以在多个主窗口中进行使用

使用:

通常在我们做app界面时,首先会新建一个主窗口,如果有一些需要复用的控件的话,可以提前写好,然后添加到主窗体中。

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。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></Grid></Border>
</Page>

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

可以看到,最外层是拥有导航的NavigationWindow,而内层还嵌套一个拥有导航的Frame.
细心的同学会发现,在上例子中我们并没有添加NavigationWindow的代码,可为什么还是有了效果呢?这是因为当设置了StartUri的对象为Page而不是Window,WPF就会为该Page创建一个NavigationWindow。

 

下面开始介绍Page之间的导航链接:
1.超链接(HyperLink)

 <Hyperlink  Click="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)</Paragraph><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"><!--<Hyperlink Click="Hyperlink_Click">-->从玉蜂说起,回顾.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">1.    从玉蜂说起,回顾.Net事件模型</Paragraph><Paragraph>木木熟悉神雕侠侣的故事,于是他根据“玉蜂传信”这样一个故事,信手画下这样一幅有趣的图。</Paragraph><BlockUIContainer><Image Source="routedevent.jpg"/></BlockUIContainer><Paragraph>其实这一幅“玉蜂传信图”暗合.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("小龙女在谷底日复一日地放着玉蜂,希望杨过有一天能看到.....");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">2.    什么是路由事件?</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
为所指定的元素。

 导航工具栏:

上图中的功能是不是很方便呢,这个在WPF中也很容易的实现.
首先,同样的设置一个Page为起始页(WPF会自动添加一个NavigationWindow),然后放置一个按钮,该按钮用于跳转,点击之后你会神奇的发现,点击导航栏的下拉会显示之前访问的页面和当前页面的链接.
不知道细心的同学会不会思考一个问题,这个链接的文本是怎么得到的呢,问题问的好,这个链接的文本可以来自多个属性,但是最终却是有一个会被使用,优先级如下:
JournalEntry.Name(在Page中设置,一个附加属性)>Page.Title>Page.WindowTitle。
当然,点击工具栏的前进和后退,也可以导航到之前访问的页面去。除了导航栏可以实现前进后退,在其他的按钮中也是可以的,代码如下:

            <Button Content="后退" Command="NavigationCommands.BrowseBack"></Button><Button Content="前进" Command="NavigationCommands.BrowseForward"></Button>

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

 

 好了,链接的部分就说到这里,之后会和大家分享,导航的高级应用以及页面更为复杂的周期应用.

转载于:https://www.cnblogs.com/ListenFly/archive/2013/02/24/2923474.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL基本运行模型

OpenGL是一种三维技术规范。 我们知道三维渲染场景需要实时计算大量数据。 这里我根据自己的经验总结出一句话&#xff1a; 计算机中&#xff0c;对性能要求高的功能模块&#xff0c;其运行原理必然是简单易行的&#xff01; 有理由断言&#xff1a;OpenGL没那么难。 OpenGL工…

【转】浅谈TDD、BDD、ATDD、DDD的区别

四个开发模式意思: TDD&#xff1a;测试驱动开发&#xff08;Test-Driven Development&#xff09;BDD&#xff1a;行为驱动开发&#xff08;Behavior Driven Development&#xff09;ATDD&#xff1a;验收测试驱动开发&#xff08;Acceptance Test Driven Development&#x…

【OSG】OSG运行模型

关于运行模型 OSG中的类很多&#xff0c;只看OSG代码&#xff0c;很难把各个类串联起来。 我们知道面向对象程序的运行模型是&#xff1a;对象对象间协作。 单纯看代码&#xff0c;多数情形下&#xff0c;只能了解程序中有哪些对象&#xff0c;而不知道它们是如何协作的&…

用姓名字段统计人数_基于 Wide amp; Deep 网络和 TextCNN 的敏感字段识别

数据治理 (Data Governance) [1]作为一种数据管理的重要一环&#xff0c;主要目的在于保证数据在整个生命周期内的高质量性。数据治理的核心包括&#xff1a;数据的可用性 (Availability)&#xff0c;易用性 (Usability)&#xff0c;一致性 (Consistency)&#xff0c;完整性 (I…

【转】C# Stream篇(—) -- Stream基类

目录&#xff1a; 什么是Stream? 什么是字节序列&#xff1f; Stream的构造函数 Stream的重要属性及方法 Stream的示例 Stream异步读写 Stream 和其子类的类图 本章总结 什么是Stream? MSDN 中的解释太简洁了: 提供字节序列的一般视图 &#xff08;我可不想这么理解…

【已解决】解决Win7安装VS2013/VS2015结束时报错“无法建立到信任根颁发机构的证书链”的问题

问题描述 最近在Win7虚拟机上上安装VS&#xff0c;等待许久之后&#xff0c;提示安装完成。但是完成界面报错&#xff1a; “无法建立到信任根颁发机构的证书链”。 而且错误还不少&#xff0c;如下图所示&#xff1a; 根据我的个人经验&#xff0c;证书问题并没有影响日常开…

【转】C# Stream篇(二)TextReader 和StreamReader

目录&#xff1a; 为什么要介绍 TextReader&#xff1f; TextReader的常用属性和方法 TextReader 示例 从StreamReader想到多态 简单介绍下Encoding 编码 StreamReader 的定义及作用 StreamReader 类的常用方法属性 StreamReader示例 本章总结 为什么要介绍 TextReade…

【数据结构】能看懂的红黑树

1 总体逻辑 1.2 二叉树 二叉树中&#xff0c;一个根节点最多有两个子节点。 1.3 二叉排序树 Binary Search Tree 二叉排序树是一个排好序的二叉树。且水平方向来看&#xff0c;总有 左节点 < 右节点 简单记忆其规律&#xff0c;可以在脑海中想象一个大大的小于号&#x…

【转】!C#中的Stream相关

计算机文件基本上分为二种&#xff1a;二进制文件和 ASCII&#xff08;也称纯文本文件&#xff09;。图形文件及文字处理程序等计算机程序都属于二进制文件。这些文件含有特殊的格式及计算机代码。ASCII 则是可以用任何文字处理程序阅读的简单文本文件&#xff0c;由一些字符的…

【转】!!c#文件系统操作类继承关系图

自己总结的&#xff0c;给大家参考一下&#xff0c;

php elasticsearch 获取索引所有文档_Elasticsearch客户端主要方法的使用规则

安装1.在 composer.json 文件中引入 elasticsearch-php&#xff1a;{ "require": { "elasticsearch/elasticsearch": "~6.0" }}2.用 composer 安装客户端&#xff1a;curl -s http://getcomposer.org/installer | phpphp composer.…

【转】SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤

转自&#xff1a;https://monday.blog.csdn.net/article/details/51122637 一&#xff1a;使用场景&#xff1a; 假如你的项目&#xff08;这里指的是手机客户端项目&#xff09;的某个版本&#xff08;例如1.0版本&#xff09;已经完成开发、测试并已经上线了&#xff0c;接…

【转】人工智能教程-前言

前言 大家好&#xff01;欢迎来到我的网站&#xff01; 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑&#xff0c;人工智能时代就要来临了&#xff0c;科幻电影中的场景将成为现实&#xff0c;未来已来&#xff01; 我很庆幸。十四年前就认定了人工智能专业&…

【转】人工智能-1.1.1 什么是神经网络

1.1.1 什么是神经网络 什么是人工智能&#xff1f;通俗来讲&#xff0c;就是让机器能像人一样思考。这个无需解释太多&#xff0c;因为通过各种科幻电影我们已经对人工智能很熟悉了。大家现在感兴趣的应该是——如何实现人工智能&#xff1f; 从1956年夏季首次提出“人工智能…

【转】人工智能-1.2.2 神经网络是如何进行预测的

上一篇文章中我们已经知道了如何将数据输入到神经网络中。那么神经网络是如何根据这些数据进行预测的呢&#xff1f;我们将一张图片输入到神经网络中&#xff0c;神经网络是如何预测这张图中是否有猫的呢&#xff1f;&#xff1f; 这个预测的过程其实只是基于一个简单的公式&a…

js 根据公历日期 算出农历_一招教会你公历换算成农历,要不要试试看

古代的历法是干支纪年&#xff0c;俗称农历或阴历&#xff0c;现在我们都统一采用公历的阿拉伯数字纪年。因此&#xff0c;就存在着一个历法的换算问题。当然&#xff0c;我们可以查历书就直接知道了&#xff0c;但是这个方法并不一定方便。现在告诉大家一个简单的口诀&#xf…

【转】Power Platform(简介)

Power Platform 系统通过允许用户执行以下三个关键操作来帮助他们推动业务发展&#xff1a;使用 Power BI 从数据中获得见解&#xff0c;通过使用 PowerApps 构建的应用程序来推动智能业务流程&#xff0c;以及使用 Power Automate 自动执行这些流程。 这些解决方案彼此配合协作…

【转】人工智能-1.2.1 如何将数据输入到神经网络中

1.2.1 如何将数据输入到神经网络中 通过对前面文章的学习&#xff0c;我们已经知道神经网络可以实现真正的人工智能。本小节我会进行详细地讲解&#xff0c;让大家彻底地弄懂神经网络。在仅仅只学完一篇文章后&#xff0c;你肯定依然感觉朦胧&#xff0c;这是正常的&#xff0…

Qt实现多屏幕多分辨率自适应

这里仅大概描述一下实现思路。 运行条件 两个屏幕&#xff0c;分辨率不同。Qt软件 问题提出 前段时间写了一个软件&#xff0c;窗口内有自绘内容。 自绘内容里面用的长度单位都是像素。可想而知&#xff0c;在开发者的电脑屏幕上大小都是符合要求的。到这一步都没问题。 软…