分享

采用C#WPF实现自己的网页浏览器(自定义Tab控件)

 风中Robin 2012-06-21

采用C#WPF实现自己的网页浏览器(自定义Tab控件)

时间:2012-06-12 18:51来源:CSDN 作者:chenyujing1234 点击:108次
编译平台:VS2008 + .Net Framework 3.5 语言: C# 此博客的目的: 以浏览器程序的实现,学习自定义TabControl的方法,使之能实现系统Tab不具有的功能: (1)排列方式扩展为:Top、Bottom、Left、Right (2)增加对TabItem的事件处理 (3) 一、浏览器实现 效果图: 1、启动窗口显示两个按钮 1、首先导入我们自己写的控件 它们
  

  编译平台:VS2008 + .Net Framework 3.5

  语言: C#

  此博客的目的:

  以浏览器程序的实现,学习自定义TabControl的方法,使之能实现系统Tab不具有的功能:

  (1)排列方式扩展为:Top、Bottom、Left、Right

  (2)增加对TabItem的事件处理

  (3)

  一、浏览器实现

  效果图:

  

 

  1、启动窗口显示两个按钮

  1、首先导入我们自己写的控件

  

 

  它们的处理函数对应是去创建窗口WindowUsingItemProperty或WindowUsingItemsSourceProperty

 private void Items_Click(object sender, RoutedEventArgs e)
        {
            // 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,用于输入网址

  

 

  当输入网址确认后的处理是获得浏览器对象并让浏览器导航到指定的网址

 private void textBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
        {
            // 按了回车键
            if (e.Key == Key.Return)
            {
                try
                {
                    // 鼠标变成等待
                    Cursor = System.Windows.Input.Cursors.Wait;
                    // 通过自己封闭的函数GetCurrentWebBrowser 获得当前的浏览器
                    System.Windows.Forms.WebBrowser browser = GetCurrentWebBrowser();
                    if (browser == nullreturn;

                    // 浏览器导航到指定的网址
                    browser.Navigate(textBox.Text);
                }
                finally
                {
                    Cursor = System.Windows.Input.Cursors.Arrow;
                }
            }
        }

  而浏览器的获得是通过当前TabItem来得到的

   private System.Windows.Forms.WebBrowser GetCurrentWebBrowser()
        {
            // 获得TabControl当前选择的TabItem
            Wpf.Controls.TabItem item = tabControl.SelectedItem as Wpf.Controls.TabItem;
            if (item == nullreturn null;

            // 获得选中的TabItem中的Content,并转化为WindowFormsHost
            WindowsFormsHost host = item.Content as WindowsFormsHost;
            if (host == nullreturn 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,来得到浏览器对象

 // 获得选中的TabItem中的Content,并转化为WindowFormsHost
            WindowsFormsHost host = item.Content as WindowsFormsHost;
            if (host == nullreturn 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中

   void Browser_DocumentTitleChanged(object sender, EventArgs e)
        {
            System.Windows.Forms.WebBrowser browser = sender as System.Windows.Forms.WebBrowser;
            if (browser == nullreturn;

            // 更新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

        void Browser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            // 获得Web浏览器
            System.Windows.Forms.WebBrowser browser = sender as System.Windows.Forms.WebBrowser;
            if (browser == nullreturn;
            // 将浏览器当前的网址传给textBox
            textBox.Text = browser.Url.ToString();
        }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多