日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

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

發(fā)布時(shí)間:2023/12/10 windows 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】页(page),用户控件(userControl),窗口(window)区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

歡迎加入BIM行業(yè)開(kāi)發(fā)交流1群 群號(hào):711844216

背景

大家在vs中新建wpf項(xiàng)目后,會(huì)發(fā)現(xiàn)在添加新建項(xiàng)時(shí)會(huì)出現(xiàn)下列三個(gè)選項(xiàng)

它們有什么區(qū)別呢?

區(qū)別:

  • 頁(yè):通常用于網(wǎng)頁(yè)
  • 窗口:通常一個(gè)桌面app只有一個(gè)主窗口
  • 用戶(hù)控件:控件需要被重復(fù)用時(shí),比如在很多窗口中,用同一個(gè)日歷控件

簡(jiǎn)而言之:一個(gè)主窗口可能存在多個(gè)用戶(hù)控件,一個(gè)用戶(hù)控件可以在多個(gè)主窗口中進(jìn)行使用

使用:

通常在我們做app界面時(shí),首先會(huì)新建一個(gè)主窗口,如果有一些需要復(fù)用的控件的話,可以提前寫(xiě)好,然后添加到主窗體中。

WPF中的Page相比Window來(lái)說(shuō)更加的精簡(jiǎn),因?yàn)樗麤](méi)有提供一個(gè)Show或者是Hide的方法,而是通過(guò)鏈接的方式進(jìn)行頁(yè)面切換。此外,一般來(lái)說(shuō)Page不設(shè)置自身的大小,因?yàn)轫?yè)面的尺寸由包含它的宿主窗體來(lái)決定的。如果設(shè)置了頁(yè)面的Width和Height大小,如果宿主的大小小于頁(yè)面的,則頁(yè)面會(huì)被裁剪;如果宿主的大小大于頁(yè)面的,則頁(yè)面會(huì)居中顯示。同時(shí)頁(yè)面可以設(shè)置WindowWidth和WindowHeight以及WindowTitle來(lái)設(shè)置宿主的寬度、高度、標(biāo)題屬性。
先看個(gè)例子:

NavigationWindow win = new NavigationWindow();//未設(shè)置大小//win.Content = new Page1();//宿主大小大于Page尺寸//win.Content = new Page1(300,300,500,500);//宿主大小小于Page尺寸win.Content = new Page1(500, 500, 300, 300);win.Show();

例子中設(shè)置了三種不同情況下頁(yè)面和宿主窗體之間的大小關(guān)系,看到的三種情況如下
三張圖片分別為,未對(duì)窗體進(jìn)行大小設(shè)置,宿主大于頁(yè)面,宿主小于頁(yè)面.


下面介紹下Page頁(yè)面的宿主問(wèn)題:
Page的宿主包括瀏覽器,導(dǎo)航窗口(NavigationWindow)和Frame,上例子中已經(jīng)使用了NavigationWindow。后兩種均為WPF提供的Page宿主窗口,提供了從一個(gè)Page導(dǎo)航到另一個(gè)Page的功能,同時(shí)可以記錄歷史導(dǎo)航,以及一系列的導(dǎo)航事件。其中NavigationWindow繼承自Window,所以在外觀上與普通的窗口最大的區(qū)別是多了一個(gè)導(dǎo)航工具欄,不過(guò)可以通過(guò)設(shè)置ShowsNavigationUI屬性控制是否顯示。
NavigationWindow為頂級(jí)窗口,不允許嵌入到其他的元素中。而Frame則為輕量級(jí),可以嵌入到其他元素中,如NavigationWindow或者Page,甚至Frame嵌套Frame。Frame默認(rèn)沒(méi)有導(dǎo)航欄,可以設(shè)置NavigationUIVisibility屬性為Visible使其顯示。


例子,如下例子在NavigationWindow中放置了一個(gè)Page,然后在Page中嵌套了一個(gè)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="該頁(yè)面的宿主窗口是一個(gè)NavigationWindow"HorizontalAlignment="Center" VerticalAlignment="Center" ></TextBlock><Frame Source="Page2.xaml" NavigationUIVisibility="Visible" Grid.Row="1"></Frame></Grid></Border> </Page>

同時(shí)設(shè)置App中的StartUrl為Page,效果如下:

可以看到,最外層是擁有導(dǎo)航的NavigationWindow,而內(nèi)層還嵌套一個(gè)擁有導(dǎo)航的Frame.
細(xì)心的同學(xué)會(huì)發(fā)現(xiàn),在上例子中我們并沒(méi)有添加NavigationWindow的代碼,可為什么還是有了效果呢?這是因?yàn)楫?dāng)設(shè)置了StartUri的對(duì)象為Page而不是Window,WPF就會(huì)為該P(yáng)age創(chuàng)建一個(gè)NavigationWindow。

?

下面開(kāi)始介紹Page之間的導(dǎo)航鏈接:
1.超鏈接(HyperLink)

<Hyperlink Click="Hyperlink_Click_1">開(kāi)始閱讀路由事件</Hyperlink><Hyperlink NavigateUri="Page4.xaml">開(kāi)始閱讀路由事件</Hyperlink> private void Hyperlink_Click_1(object sender, RoutedEventArgs e){NavigationService.Navigate(new Uri("pack://application:,,,/Page4.xaml"));}

上述代碼使用了HyperLink的兩種方式進(jìn)行導(dǎo)航,一種是設(shè)置NavigateUri屬性為目標(biāo)頁(yè),另一種是使用NavigationService類(lèi)的Navigate方法來(lái)進(jìn)行導(dǎo)航頁(yè)(當(dāng)然,此方法不限于
HyperLink使用).
除了上述比較簡(jiǎn)單的使用外,HyperLink還可以在元素之間進(jìn)行導(dǎo)航,例子如下:

<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>黃蓉凝目看去,只見(jiàn)那兩只玉蜂雙翅上也都有字,那六個(gè)字也是一模一樣,右翅是“情谷底”,左翅是“我在絕”。黃蓉大奇,暗想:“造物雖奇,也決造不出這樣一批蜜蜂來(lái)之理。其中必有緣故?!?……</Paragraph><Paragraph>黃蓉不答,只是輕輕念著:“情谷底,我在絕。情谷底,我在絕。”她念了幾遍,隨即省悟:“啊!那是‘我在絕情谷底’。是誰(shuí)在絕情谷底啊?難道是襄兒?”心中怦怦亂跳……</Paragraph><Paragraph TextAlignment="Right">——《神雕俠侶:第三十八回 生死茫?!?lt;/Paragraph></Section><Section LineHeight="25" FontSize="15"><Paragraph >這一段講的是小龍女深陷絕情谷地,用花樹(shù)上的細(xì)刺,在玉蜂翅上刺下‘我在絕情谷底’六字,盼望玉蜂飛上之后,能為人發(fā)現(xiàn)。結(jié)果蜂翅上的細(xì)字被周伯通發(fā)現(xiàn),而給黃蓉隱約猜到了其中含義。本節(jié)內(nèi)容包括:</Paragraph><List ><ListItem><Paragraph><Hyperlink NavigateUri="Page4.xaml#first"><!--<Hyperlink Click="Hyperlink_Click">-->從玉蜂說(shuō)起,回顧.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>路由事件的實(shí)例</Paragraph></ListItem></List></Section><Paragraph x:Name="first" FontSize="20" Background="AliceBlue">1. 從玉蜂說(shuō)起,回顧.Net事件模型</Paragraph><Paragraph>木木熟悉神雕俠侶的故事,于是他根據(jù)“玉蜂傳信”這樣一個(gè)故事,信手畫(huà)下這樣一幅有趣的圖。</Paragraph><BlockUIContainer><Image Source="routedevent.jpg"/></BlockUIContainer><Paragraph>其實(shí)這一幅“玉蜂傳信圖”暗合.Net的事件模型。小龍女是事件的發(fā)布者,她發(fā)布了事件“我在絕情谷底”;老頑童和黃蓉是事件的訂閱者,不過(guò)老頑童并沒(méi)有處理該事件,而黃蓉處理了事件,隱約能猜出其中含義;至于可憐的小楊過(guò),則根本沒(méi)有訂閱事件,只是苦苦念叨“龍兒,龍兒,你在哪兒……”;而玉蜂正是傳遞信息的事件。事件,事件的發(fā)布者和事件的訂閱者構(gòu)成了.Net事件模型的三個(gè)角色。在.Net當(dāng)中,一個(gè)事件是用關(guān)鍵字event來(lái)表示的。如下代碼所示:</Paragraph><Paragraph xml:space="preserve" Background="#88888888">public delegate void WhiteBee(string param); //聲明了玉蜂的委托// 小龍女類(lèi)class XiaoLongnv{public event WhiteBee WhiteBeeEvent; //玉蜂事件public void OnFlyBee(){Console.WriteLine("小龍女在谷底日復(fù)一日地放著玉蜂,希望楊過(guò)有一天能看到.....");WhiteBeeEvent(msg);}private string msg = "我在絕情谷底"; }// 老頑童類(lèi)class LaoWantong{public void ProcessBeeLetter(string msg){Console.WriteLine("老頑童:小蜜蜂、小蜜蜂,別跑");}}// 黃蓉類(lèi)class Huangrong{public void ProcessBeeLetter(string msg){Console.WriteLine("黃蓉:\"{0}\",莫非......",msg);} }// 楊過(guò)類(lèi)class YangGuo{public void ProcessBeeLetter(string msg){Console.WriteLine("楊過(guò):\"{0}\",我一定會(huì)找她!", msg);}public void Sign(){Console.WriteLine("楊過(guò)嘆息:龍兒,你在哪兒....");} }static void Main(string[] args){// 第一步 人物介紹XiaoLongnv longnv = new XiaoLongnv(); //小龍女LaoWantong wantong = new LaoWantong(); //老頑童Huangrong rong = new Huangrong(); //黃蓉YangGuo guo = new YangGuo(); //楊過(guò)// 第二步 訂閱事件,唯獨(dú)沒(méi)有訂閱楊過(guò)的ProcessBeeLetter;longnv.WhiteBeeEvent += wantong.ProcessBeeLetter;longnv.WhiteBeeEvent += rong.ProcessBeeLetter;// longnv.WhiteBeeEvent += guo.ProcessBeeLetter; //楊過(guò)是沒(méi)有訂閱小龍女的玉蜂事件// 第三步 小龍女玉蜂傳信longnv.OnFlyBee();// 第四步 楊過(guò)嘆息guo.Sign();} </Paragraph><Paragraph x:Name="second" FontSize="20" Background="AliceBlue">2. 什么是路由事件?</Paragraph><Paragraph>什么是路由事件呢?木木很快查看了一下MSDN,MSDN從功能和實(shí)現(xiàn)兩種視角給出了路由事件的定義。</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>雖然木木現(xiàn)在英語(yǔ)功底已經(jīng)進(jìn)步了很多,但是這兩個(gè)定義還是讓他看得一頭霧水??磥?lái)必須得找個(gè)例子有點(diǎn)感性的認(rèn)識(shí)(以大家都非常熟悉的Button的Click事件為例,該事件是個(gè)路由事件,可以通過(guò)Reflector查看ButtonBase的源碼)。</Paragraph></FlowDocument></FlowDocumentReader></Grid> </Page>

上述代碼較長(zhǎng)(摘抄自 WPF葵花寶典),使用了一個(gè)FlowDocumentReader文本閱讀控件,在其中有多個(gè)段落(Paragraph),同時(shí)在HyperLink中設(shè)置了NavigateUri,可以看到
屬性值除了包含xaml名稱(chēng)之外,還包含了"#"這樣的符號(hào),沒(méi)錯(cuò)這個(gè)就是類(lèi)似于Html中的,本頁(yè)之間的超鏈,通過(guò)指定"#元素名稱(chēng)",在點(diǎn)擊HyperLink之后,就可以導(dǎo)航到Name
為所指定的元素。

?導(dǎo)航工具欄:

上圖中的功能是不是很方便呢,這個(gè)在WPF中也很容易的實(shí)現(xiàn).
首先,同樣的設(shè)置一個(gè)Page為起始頁(yè)(WPF會(huì)自動(dòng)添加一個(gè)NavigationWindow),然后放置一個(gè)按鈕,該按鈕用于跳轉(zhuǎn),點(diǎn)擊之后你會(huì)神奇的發(fā)現(xiàn),點(diǎn)擊導(dǎo)航欄的下拉會(huì)顯示之前訪問(wèn)的頁(yè)面和當(dāng)前頁(yè)面的鏈接.
不知道細(xì)心的同學(xué)會(huì)不會(huì)思考一個(gè)問(wèn)題,這個(gè)鏈接的文本是怎么得到的呢,問(wèn)題問(wèn)的好,這個(gè)鏈接的文本可以來(lái)自多個(gè)屬性,但是最終卻是有一個(gè)會(huì)被使用,優(yōu)先級(jí)如下:
JournalEntry.Name(在Page中設(shè)置,一個(gè)附加屬性)>Page.Title>Page.WindowTitle。
當(dāng)然,點(diǎn)擊工具欄的前進(jìn)和后退,也可以導(dǎo)航到之前訪問(wèn)的頁(yè)面去。除了導(dǎo)航欄可以實(shí)現(xiàn)前進(jìn)后退,在其他的按鈕中也是可以的,代碼如下:

<Button Content="后退" Command="NavigationCommands.BrowseBack"></Button><Button Content="前進(jìn)" Command="NavigationCommands.BrowseForward"></Button>

只需指定按鈕的Command屬性為對(duì)應(yīng)的命令即可,是不是很簡(jiǎn)單呢。

?

?好了,鏈接的部分就說(shuō)到這里,之后會(huì)和大家分享,導(dǎo)航的高級(jí)應(yīng)用以及頁(yè)面更為復(fù)雜的周期應(yīng)用.

轉(zhuǎn)載于:https://www.cnblogs.com/ListenFly/archive/2013/02/24/2923474.html

總結(jié)

以上是生活随笔為你收集整理的【转】页(page),用户控件(userControl),窗口(window)区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。