使用AvalonDock制作WPF多标签浏览器(一)
AvalonDock是CodePlex上的一個(gè)開源項(xiàng)目,利用它可以很容易的做出類似于VS的UI效果。
下圖是AvalonDock源碼中自帶的一個(gè)Demo:
我們可以用這款第三方控件為基礎(chǔ)來制作多標(biāo)簽瀏覽器。
下面是最終效果圖:
?
甚至可以把其中一個(gè)標(biāo)簽拖出主窗體成為一個(gè)獨(dú)立的窗口:
是不是很像VS2010中新的TextEditor啊,呵呵。
但是觀察一下常用的瀏覽器,比如IE:
Chrome:
FireFox:
它們都有一個(gè)添加新標(biāo)簽的按鈕,但是AvalonDock的DocumentPane默認(rèn)并沒有新建一個(gè)DocumentContent的按鈕。
DocumentPane和DocumentContent是AvalonDock中眾多類型中的兩個(gè),DocumentPane是DocumentContent的父級(jí)容器,DocumentContent中則可以置入任何UI元素,比如說一個(gè)WebBrowser。
所以我們的第一步就從給AvalonDock的DocumentPane寫一個(gè)添加新DocumentContent的按鈕開始吧。
首先ReStyle,從AvalonDock的源碼中找到DocumentPaneStyles.xaml這個(gè)文件,定位到
代碼<Button?x:Name="PART_ShowContextMenuButton"?DockPanel.Dock="Right"?Width="18"?Height="18"?Style="{StaticResource?PaneHeaderCommandStyle}"?Command="ad:DocumentPane.ShowDocumentsListMenuCommand">
????????????????????????????????????????<ad:AlignedImage>
????????????????????????????????????????????<Image?x:Name="ShowContextMenuIcon"?Source="Images\PinMenu.png"?Width="13"?Height="13"?Stretch="Uniform"/>
????????????????????????????????????????</ad:AlignedImage>
????????????????????????????????????</Button>
?
?
這段代碼
緊接著這段代碼添加如下代碼:
代碼<Button?DockPanel.Dock="Right"?Width="18"?Height="18"?Style="{StaticResource?PaneHeaderCommandStyle}"?Command="ad:DocumentPane.AddNewCommand">
????????????????????????????????????????<ad:AlignedImage>
????????????????????????????????????????????<Image?Source="Images\add.png"?Width="13"?Height="13"?Stretch="Uniform"/>
????????????????????????????????????????</ad:AlignedImage>
????????????????????????????????????</Button>
?
?
其中的add.png是我從網(wǎng)上隨便找的一個(gè)加號(hào)的圖片;
其中的ad:DocumentPane.AddNewCommand是緊接下來我們要給DocumentPane添加的一個(gè)Command。
找到DocumentPane.cs文件并添加代碼:
代碼public?static?RoutedCommand?AddNewCommand?=?new?RoutedCommand();
????????private?void?ExecutedAddNewCommand(object?sender,?ExecutedRoutedEventArgs?e)
????????{
????????????AddNew();
????????}
????????private?void?AddNew()
????????{
????????????DocumentContent?newContent?=?new?DocumentContent();
????????????newContent.Title?=?"new?content";
????????????newContent.IsFloatingAllowed?=?true;
????????????Items.Add(newContent);
????????}
????????private?void?CanExecuteAddNewCommand(object?sender,?CanExecuteRoutedEventArgs?e)
????????{
????????????e.CanExecute?=?true;
????????}
?
?
然后再在其OnInitialized方法中添加如下一句:
this.CommandBindings.Add(new?CommandBinding(AddNewCommand,?ExecutedAddNewCommand,?CanExecuteAddNewCommand));
?
?
這樣我們就給DocumentPane添加了一個(gè)加號(hào)按鈕并把它和AddNewCommand這個(gè)命令聯(lián)系了起來,點(diǎn)擊按鈕時(shí)我們添加的AddNew方法就會(huì)執(zhí)行。由于DocumentPane是WPF中Selector的子類,而Selector又繼承自ItemsControl,所以DocumentPane會(huì)有一個(gè)Items屬性,我們?cè)?/font>AddNew方法中做的就是給其Items中塞進(jìn)一個(gè)新的DocumentContent。
這時(shí)再次運(yùn)行AvalonDock自帶的Demo,可以看見右側(cè)有一個(gè)小加號(hào)按鈕,點(diǎn)擊按鈕則可以新建標(biāo)簽頁(yè):
OK!第一步搞定了。
但是每一個(gè)標(biāo)簽都是空的,下一步要給每個(gè)標(biāo)簽中添加一個(gè)WebBrowser。
是不是修改一下前面添加的AddNew方法,在里面new?up一個(gè)WebBrowser呢,不太好,這樣感覺不是在修改而是在破壞AvalonDock的源碼,畢竟AvalonDock是一個(gè)控件庫(kù),添加一個(gè)新標(biāo)簽時(shí),其默認(rèn)行為就應(yīng)該是讓標(biāo)簽為空。
給每個(gè)新添加的空標(biāo)簽中置入一個(gè)WebBrowser應(yīng)該是在客戶代碼中做的事兒。
這部分明天再寫吧,洗洗去看10-4?show了。(挺好看的視頻,講VS2010和.Net?4?new?features的:http://channel9.msdn.com/shows/10-4/?)
Over?and?out!Ciao!
轉(zhuǎn)載于:https://www.cnblogs.com/cuipengfei/archive/2010/03/15/1686699.html
總結(jié)
以上是生活随笔為你收集整理的使用AvalonDock制作WPF多标签浏览器(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从文本分类问题中的特征词选择算法追踪如何
- 下一篇: 面试题——面经题目(1)