编译平台:VS2008 + .Net Framework 3.5
语言: C#
此博客的目的:
以浏览器程序的实现,学习自定义TabControl的方法,使之能实现系统Tab不具有的功能:
(1)排列方式扩展为:Top、Bottom、Left、Right
(2)增加对TabItem的事件处理
(3)
一、浏览器实现
效果图:
1、启动窗口显示两个按钮
1、首先导入我们自己写的控件
它们的处理函数对应是去创建窗口WindowUsingItemProperty或WindowUsingItemsSourceProperty
{
// WindowUsingItemProperty对应于WindowUsingItemsProperty.xaml文件中的
// <Window x:Class="Test.WindowUsingItemProperty"
var win = new WindowUsingItemProperty();
win.Show();
}
private void ItemsSource_Click(object sender, RoutedEventArgs e)
{
var win = new WindowUsingItemsSourceProperty();
win.Show();
}
接下来的设计我们以WindowUsingItemProperty为例来说明.
2、加入自定义控件Wpf.TabControl
在WindowUsingItemProperty窗口的界面设计文件WindowUsingItemProperty.xaml中加入自定义控件Wpf.TabControl.
3、浏览器界面控件布局
首先将界面分为三行:
3、1 每一行加入TextBlock与TextBox,用于输入网址
当输入网址确认后的处理是获得浏览器对象并让浏览器导航到指定的网址
{
// 按了回车键
if (e.Key == Key.Return)
{
try
{
// 鼠标变成等待
Cursor = System.Windows.Input.Cursors.Wait;
// 通过自己封闭的函数GetCurrentWebBrowser 获得当前的浏览器
System.Windows.Forms.WebBrowser browser = GetCurrentWebBrowser();
if (browser == null) return;
// 浏览器导航到指定的网址
browser.Navigate(textBox.Text);
}
finally
{
Cursor = System.Windows.Input.Cursors.Arrow;
}
}
}
而浏览器的获得是通过当前TabItem来得到的
{
// 获得TabControl当前选择的TabItem
Wpf.Controls.TabItem item = tabControl.SelectedItem as Wpf.Controls.TabItem;
if (item == null) return null;
// 获得选中的TabItem中的Content,并转化为WindowFormsHost
WindowsFormsHost host = item.Content as WindowsFormsHost;
if (host == null) return null;
// 获得WindowFormsHost的Child,来得到浏览器对象
System.Windows.Forms.WebBrowser browser = host.Child as System.Windows.Forms.WebBrowser;
return browser;
}
3、2 根据自定义控件TabControl的规则加入节点
请注意空间 r: 的原因。
3、2、1 对TabControl中的TabItem显示的三种状态进行设置。
目的是为了看起来像IE7的样子。
3、2、2 加入TabItem
TabItem中包括了对Header、Icon的设置,及在Item中的内容中包裹WebI浏览器
在 3、1 中我们看到GetCurrentWebBrowser的获得有两个步骤:
(1)获得选中的TabItem中的Content,并转化为WindowFormsHost
(2)获得WindowFormsHost的Child,来得到浏览器对象
WindowsFormsHost host = item.Content as WindowsFormsHost;
if (host == null) return null;
// 获得WindowFormsHost的Child,来得到浏览器对象
System.Windows.Forms.WebBrowser browser = host.Child as System.Windows.Forms.WebBrowser;
3、2、2、1 浏览器DocumentTitleChanged、Navigated两个事件的处理
Browser_DocumentTitleChanged主要是更新TabItems的头特性、增加一个Icon到tabItem、把浏览器的DocumentTitle加入到tabItem中的Head中
{
System.Windows.Forms.WebBrowser browser = sender as System.Windows.Forms.WebBrowser;
if (browser == null) return;
// 更新TabItems的头特性
Wpf.Controls.TabItem item = tabControl.SelectedItem as Wpf.Controls.TabItem;
// 增加一个Icon到tabItem
BitmapImage image = new BitmapImage(new Uri("pack://application:,,,/Test;component/Images/ie.ico"));
Image img = new Image();
img.Source = image;
img.Width = 16;
img.Height = 16;
img.Margin = new Thickness(2, 0, 2, 0);
if (item != null) item.Icon = img;
// 把浏览器的DocumentTitle加入到tabItem中的Head中
TextBlock tb = new TextBlock();
tb.Text= browser.DocumentTitle;
tb.TextTrimming = TextTrimming.CharacterEllipsis;
tb.TextWrapping = TextWrapping.NoWrap;
if (item != null) item.Header = tb;
}
Browser_Navigated主要是将浏览器当前的网址传给textBox
{
// 获得Web浏览器
System.Windows.Forms.WebBrowser browser = sender as System.Windows.Forms.WebBrowser;
if (browser == null) return;
// 将浏览器当前的网址传给textBox
textBox.Text = browser.Url.ToString();
}