一、上文回顾

上编实现了简单的网页加载功能包括URL输入、打开空标签页、网页链接中新页面处理等

本编将对网页的Title绑定、前进、后退、刷新等事件处理

二、Title绑定处理

当打开网页时Title一直是新标签页,而Edge浏览器中是动态变化的,因此我们需要建立起绑定机制,那么如何取网页Title?

查看ChromiumWebBrowser 类定义

public static readonly DependencyProperty TitleProperty;

发现其有Title的依赖属性,并在类定义中找到了 TitleChanged事件

public event DependencyPropertyChangedEventHandler TitleChanged;

因此只要将Tab页的Header属性与ChromiumWebBrowser类中的Title建立起关系就可以

创建 WebTabItemViewModel 添加 Header属性

public class WebTabItemViewModel: BaseViewModel
{
private string _title = "新标签页";
public string Title{ get =>_title ; set { _title = value; OnPropertyChanged("Title"); } }
}

在TitleChanged 改变时赋值给Header

private void CefWebBrowser_TitleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
ViewModel.Title= CefWebBrowser.Title;
}

并在新打开Tab页时建立绑定

private void TabItemAdd(object obj)
{
try
{
var uc = new WebTabItemUc { TargetUrl = obj?.ToString() };
var item = new TabItem { Content = uc };
var bind = new Binding { Source = uc.DataContext, Path = new PropertyPath("Header") };
item.SetBinding(HeaderedContentControl.HeaderProperty, bind);
WebTabControl.Items.Add(item);
WebTabControl.SelectedItem = item;
WebTabControl.SetHeaderPanelWidth();
}
catch (Exception ex)
{ }
}

此处可以直接绑定ChromiumWebBrowser 的Title属性,但为了能使当打开新Tab页时显示【新标签页】所以做了个ViewModel处理

运行看下效果

此时Title还缺个Favicon,Favicon 格式为协议+域名+端口+/favicon.ico

如百度https://www.baidu.com/favicon.ico

故增加favicon获取方法

private ImageSource GetFavicon()
{
try
{
var pattern = @"(\w+:\/\/)([^/:]+)(:\d*)?";
var address = CefWebBrowser.Address;
var matches = Regex.Matches(address, pattern);
return matches.Count <= 0 ? null : ImageHelper.GetBitmapFrame($"{matches[0]}/favicon.ico");
}
catch (Exception e)
{
return ImageHelper.DefaultFavicon;
}
}
public static ImageSource GetBitmapFrame(string httpUrl)
{
try
{
return string.IsNullOrEmpty(httpUrl) ? DefaultFavicon :
BitmapFrame.Create(new Uri(httpUrl), BitmapCreateOptions.None, BitmapCacheOption.Default);
}
catch
{
return DefaultFavicon;
}

并暂时将此方法加到Browser Title改变事件中

private void CefWebBrowser_TitleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
ViewModel.Title = CefWebBrowser.Title;
ViewModel.Favicon = GetFavicon();
}

接下来需要对ViewModel中Favicon 进行界面绑定关联

此时需要对Tabitem进行扩展这里使用附加属性来绑定Favicon

<Grid HorizontalAlignment="{TemplateBinding HorizontalAlignment}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Image x:Name="PART_Favicon" Grid.Column="0" Source="{TemplateBinding attached:AttachedPropertyClass.ImageSource}" Width="18" Height="18"/>
<ContentPresenter Grid.Column="1" x:Name="contentPresenter" ContentSource="Header" Focusable="False"
HorizontalAlignment="Left"
Margin="{TemplateBinding Padding}" RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="Center">
<ContentPresenter.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontSize" Value="14"/>
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
<!--不知为什么直接在tabitem中设置fontsize不起作用-->
</Style>
</ContentPresenter.Resources>
</ContentPresenter>
<Button Grid.Column="2" Style="{StaticResource TabCloseButton}"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MTabControl}},Path=TabItemRemoveCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabItem}}}" />
</Grid>

Xaml中 PART_Favicon 绑定附加属性 ImageSource接下来对附加属性与ViewModel中的Favicon进行绑定

在TabItemAdd方法中增加绑定

private void TabItemAdd(object obj)
{
try
{
var uc = new WebTabItemUc { ViewModel = { CurrentUrl = obj?.ToString() } };
var item = new TabItem { Content = uc };
var titleBind = new Binding { Source = uc.DataContext, Path = new PropertyPath("Title") };
item.SetBinding(HeaderedContentControl.HeaderProperty, titleBind); var faviconBind = new Binding { Source = uc.DataContext, Path = new PropertyPath("Favicon") };
item.SetBinding(AttachedPropertyClass.ImageSourceProperty, faviconBind); WebTabControl.Items.Add(item);
WebTabControl.SelectedItem = item;
WebTabControl.SetHeaderPanelWidth();
}
catch (Exception ex)
{ }
}

再次运行程序

三、前进、后退、刷新处理

前进、后退、刷新是IWebBrowser的扩展方法 在WebBrowserExtensions类中

分别添加按钮的响应事件如下

private void NavigationForward_OnClick(object sender, RoutedEventArgs e)
{
  this.CefWebBrowser.Forward();
} private void NavigationBack_OnClick(object sender, RoutedEventArgs e)
{
  this.CefWebBrowser.Back();
} private void NavigationRefresh_OnClick(object sender, RoutedEventArgs e)
{
  this.CefWebBrowser.Reload();
}

绑定前进后退按钮可用状态 分别为CanGoForward、CanGoBack

<StackPanel Grid.Column="0" Orientation="Horizontal" x:Name="NavigationStackPanel">
<Button Style="{DynamicResource Button.NavigationBack}" IsEnabled="{Binding CanGoBack}" Click="NavigationBack_OnClick"/>
<Button Style="{DynamicResource Button.NavigationForward}" IsEnabled="{Binding CanGoForward}" Click="NavigationForward_OnClick"/>
<Button Style="{DynamicResource Button.NavigationRefresh}" Click="NavigationRefresh_OnClick"/>
</StackPanel>

在cs代码中进行 NavigationStackPanel的上下文绑定

NavigationStackPanel.DataContext = CefWebBrowser;

此处我们直接绑定ChromiumWebBrowser 的依赖属性,故DataContext赋值为 CefWebBrowser

四、源码地址

gitee地址:https://gitee.com/sirius_machao/mweb-browser

基于CefSharp开发(三)浏览器头部优化的更多相关文章

  1. 基于CefSharp开发浏览器(八)浏览器收藏夹栏

    一.前言 上一篇文章 基于CefSharp开发(七)浏览器收藏夹菜单 简单实现了部分收藏夹功能 如(添加文件夹.添加收藏.删除.右键菜单部分功能) 后续代码中对MTreeViewItem进行了扩展,增 ...

  2. mac 下基于firebreath 开发多浏览器支持的浏览器插件

    mac 下基于firebreath 开发多浏览器支持的浏览器插件 首先要区分什么是浏览器扩展和浏览器插件;插件可以像本地程序一样做的更多 一. 关于 firebreath http://www.fir ...

  3. 基于CefSharp开发(二)自定义浏览器窗体

    上一篇 https://www.cnblogs.com/mchao/p/13914726.html 简单了解了CefSharp引用配置但页面光秃秃的,这一篇着手开发简单浏览器窗体 一.Edge浏览器窗 ...

  4. 基于CefSharp开发(五)浏览器菜单样式

    一.菜单分析 上图为Edge浏览器现有的菜单内容,菜单中即有子菜单也有组合菜单. 本章节将开发浏览器菜单样式,菜单部分功能将后期进行处理. 二.创建菜单用户控件 新建用户控件命名为WebMenuUc, ...

  5. 基于CefSharp开发(四)浏览器文件下载

    一.CefSharp文件下载分析 查看ChromiumWebBrowser类发现cef数据下载处理在IDownloadHandler中进行,但并未找到相应的实现类,故我们需要自己实现DownloadH ...

  6. 基于CefSharp开发(七)浏览器收藏夹菜单

    一.Edge收藏夹菜单分析 如下图所示为Edge收藏夹菜单, 点击收藏夹菜单按钮(红框部分)弹出收藏夹菜单窗体,窗体中包含工具栏(绿框部分)和树型菜单(黄框部分) 工具栏按钮功能分别为添加当前网页到根 ...

  7. 基于CefSharp开发浏览器(九)浏览器历史记录弹窗面板

    一.前言 前两篇文章写的是关于浏览器收藏夹的内容,因为收藏夹的内容不会太多,故采用json格式的文本文件作为收藏夹的存储方式. 关于浏览器历史记录,我个人每天大概会打开百来次网页甚至更多,时间越长历史 ...

  8. 基于CefSharp开发(六)浏览器网页缩放

    一.网页缩放分析 缩放入口 1.Ctrl + 鼠标滑轮缩放 2.菜单中缩放子菜单缩放 3.搜索框中网页缩放按钮缩放 缩放属性及命令 ChromiumWebBrowser 提供了缩放量值.缩放级别.放大 ...

  9. 基于cefsharp的用户浏览器

    技术:vc++2015   概述 用于需要制作一个浏览器 winfrom 中浏览器的插件有很多种 如:WebBrowser , Web.kit等 但用于比较稳定 功能齐全的还是cefsharp 详细 ...

随机推荐

  1. linux 查看和设置主机名

    1.设置主机名 通过编辑/etc/sysconfig/network文件中的HOSTNAME字段就可以修改主机名.如下所示: [root@zijuan /]# vim /etc/sysconfig/n ...

  2. mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  3. leetcode76set-matrix-zeroes

    题目描述 给定一个m*n的矩阵,如果有一个元素是0,就把该元素所在的行和列上的元素全置为0,要求使用原地算法. 拓展: 你的算法有使用额外的空间吗? 一种比较直接的算法是利用O(m,n)的空间,但是这 ...

  4. reids 入门

    1.reids 服务的安装有两种 1.1 exe文件安装,安装完成后,就直接在 "服务"列表中可以查看,并可以停止或启动 1.2 命令行安装:将文件解压至指定文件夹,CMD命令进入 ...

  5. excel导出csv包括逗号等的处理

    /** * @Title: trimRubbishChar * @Description: 导出的时候需要对一格的内容进行检查,看是否有非法字符,以免串行 * @Since: 2016年8月2日 下午 ...

  6. 使用Selenium爬取京东电商数据(以手机商品为例)

    进入京东(https://www.jd.com)后,我如果搜索特定的手机产品,如oppo find x2,会先出现如下的商品列表页: 如果点击进入其中一个商品会进入到如下图所示的商品详情页,可以看到用 ...

  7. 各种编程语言忽略http的SSL证书认证

    目录 前言 代码 go语言 Python语言 Ruby语言 Java语言 PHP语言 C#语言 前言 我们内部测试的http服务器很多时候证书都是没有经过第三方认证的,我们发送http请求基本上都是忽 ...

  8. binary hacks读数笔记(readelf命令)

    可以用readelf命令来查看elf文件内容,跟objdump相比,这个命令更详细. 1. readelf -h SimpleSection.o ELF Header: Magic: 7f 45 4c ...

  9. Python_教程_使用Visual Studio Code开发Django项目

    如何获得 Visual Studio Code 访问 http://code.visualstudio.com 下载并安装. 前提条件 安装Python 2.7 及 Python 3.5,Window ...

  10. Redis订阅

    1.Redis订阅简介 进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 2.Redis订阅命令 3.Redis订阅的使用 先订阅后发布后才能收到消息, 1 可以一次性订 ...