简单实现的WPF浏览器,有兴趣的可以自己扩展(带源码)
完整的 WPF 嵌入式浏览器项目(CefSharp)+ 前进/后退/刷新 + 全屏 + 可隐藏书签 + 自定义书签名称 + 动态增删书签 的详细步骤,从零开始搭建并运行。
步骤 1:创建 WPF 项目
- 打开 Visual Studio 2022 或 2023
- 点击 创建新项目 → WPF App (.NET 8)
- 项目名称:
EmbeddedBrowserApp - 保存位置:任意目录
- 框架选择:
.NET 6.0 - 创建完成后,解决方案中会生成
App.xaml和MainWindow.xaml
步骤 2:安装 CefSharp
-
打开 NuGet 包管理器 → 管理解决方案的 NuGet 包
-
搜索并安装以下两个包(版本选择最新稳定版本,支持 .NET 8):
CefSharp.WpfCefSharp.Common
CefSharp 是 Chromium 内核浏览器,WPF 用
CefSharp.Wpf
步骤 3:修改 App.xaml.cs
确保 CefSettings.CachePath 使用绝对路径,避免报错:
csharp
using CefSharp;
using CefSharp.Wpf;
using System.IO;
using System.Windows;
namespace EmbeddedBrowserApp
{
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var settings = new CefSettings
{
CachePath = Path.GetFullPath("cache"), // 绝对路径
Locale = "zh-CN",
LogSeverity = LogSeverity.Disable
};
Cef.Initialize(settings);
}
protected override void OnExit(ExitEventArgs e)
{
Cef.Shutdown();
base.OnExit(e);
}
}
}
步骤 4:修改 MainWindow.xaml
完整界面,包括地址栏、前进后退按钮、书签面板、书签名称输入和切换按钮:
xml
<Window x:Class="EmbeddedBrowserApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cef="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
Title="Embedded Browser"
WindowStyle="None"
WindowState="Maximized"
ResizeMode="NoResize">
<DockPanel>
<!-- 顶部工具栏 -->
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="5">
<Button Content="◀" Click="Back_Click" Width="40" Margin="2"/>
<Button Content="▶" Click="Forward_Click" Width="40" Margin="2"/>
<Button Content="⟳" Click="Reload_Click" Width="40" Margin="2"/>
<TextBox x:Name="TbUrl" Width="400" Margin="5,2" KeyDown="TbUrl_KeyDown"/>
<Button Content="Go" Click="Go_Click" Width="60" Margin="2"/>
<Button Content="全屏/退出" Click="ToggleFullScreen_Click" Width="80" Margin="2"/>
<!-- 书签名称输入 -->
<TextBox x:Name="TbBookmarkName" Width="150" Margin="5,2" PlaceholderText="书签名称"/>
<Button Content="★添加书签" Click="AddBookmark_Click" Width="100" Margin="2"/>
<Button Content="✖删除书签" Click="RemoveBookmark_Click" Width="100" Margin="2"/>
<Button Content="📂切换书签" Click="ToggleBookmarkPanel_Click" Width="100" Margin="2"/>
</StackPanel>
<DockPanel>
<!-- 左侧书签列表 -->
<ListBox x:Name="BookmarkList" DockPanel.Dock="Left" Width="200" SelectionChanged="BookmarkList_SelectionChanged"/>
<!-- 浏览器控件 -->
<cef:ChromiumWebBrowser x:Name="Browser" Address="http://localhost:8080"/>
</DockPanel>
</DockPanel>
</Window>
步骤 5:修改 MainWindow.xaml.cs
实现 浏览器操作 + 全屏 + 动态书签(带名字,可隐藏/显示/删除):
csharp
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using System.Windows;
using System.Windows.Input;
namespace EmbeddedBrowserApp
{
public partial class MainWindow : Window
{
private bool isFullScreen = true;
private bool bookmarksVisible = true;
private string bookmarkFile = "bookmarks.json";
private List<BookmarkItem> bookmarks = new List<BookmarkItem>();
public MainWindow()
{
InitializeComponent();
LoadBookmarks();
}
#region 浏览器功能
private void Back_Click(object sender, RoutedEventArgs e)
{
if (Browser.CanGoBack) Browser.Back();
}
private void Forward_Click(object sender, RoutedEventArgs e)
{
if (Browser.CanGoForward) Browser.Forward();
}
private void Reload_Click(object sender, RoutedEventArgs e)
{
Browser.Reload();
}
private void Go_Click(object sender, RoutedEventArgs e)
{
NavigateTo(TbUrl.Text);
}
private void TbUrl_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter) NavigateTo(TbUrl.Text);
}
private void NavigateTo(string url)
{
if (!url.StartsWith("http", System.StringComparison.OrdinalIgnoreCase))
url = "http://" + url;
Browser.Address = url;
}
private void ToggleFullScreen_Click(object sender, RoutedEventArgs e)
{
if (isFullScreen)
{
this.WindowStyle = WindowStyle.SingleBorderWindow;
this.WindowState = WindowState.Normal;
this.ResizeMode = ResizeMode.CanResize;
isFullScreen = false;
}
else
{
this.WindowStyle = WindowStyle.None;
this.WindowState = WindowState.Maximized;
this.ResizeMode = ResizeMode.NoResize;
isFullScreen = true;
}
}
#endregion
#region 书签功能
private void AddBookmark_Click(object sender, RoutedEventArgs e)
{
string url = Browser.Address;
string name = TbBookmarkName.Text.Trim();
if (string.IsNullOrWhiteSpace(url)) return;
if (string.IsNullOrWhiteSpace(name)) name = url;
var bm = new BookmarkItem { Title = name, Url = url };
bookmarks.Add(bm);
BookmarkList.Items.Add(bm.Title);
SaveBookmarks();
TbBookmarkName.Clear();
}
private void RemoveBookmark_Click(object sender, RoutedEventArgs e)
{
int index = BookmarkList.SelectedIndex;
if (index >= 0 && index < bookmarks.Count)
{
bookmarks.RemoveAt(index);
BookmarkList.Items.RemoveAt(index);
SaveBookmarks();
}
}
private void BookmarkList_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
int index = BookmarkList.SelectedIndex;
if (index >= 0 && index < bookmarks.Count)
{
Browser.Address = bookmarks[index].Url;
}
}
private void ToggleBookmarkPanel_Click(object sender, RoutedEventArgs e)
{
bookmarksVisible = !bookmarksVisible;
BookmarkList.Visibility = bookmarksVisible ? Visibility.Visible : Visibility.Collapsed;
}
private void LoadBookmarks()
{
if (File.Exists(bookmarkFile))
{
string json = File.ReadAllText(bookmarkFile);
bookmarks = JsonSerializer.Deserialize<List<BookmarkItem>>(json) ?? new List<BookmarkItem>();
foreach (var bm in bookmarks)
{
BookmarkList.Items.Add(bm.Title);
}
}
}
private void SaveBookmarks()
{
string json = JsonSerializer.Serialize(bookmarks, new JsonSerializerOptions { WriteIndented = true });
File.WriteAllText(bookmarkFile, json);
}
private class BookmarkItem
{
public string Title { get; set; }
public string Url { get; set; }
}
#endregion
}
}
步骤 6:运行项目
- 编译项目,如果 NuGet 包安装正确,应该没有报错
- 启动项目,默认加载
http://localhost:8080 - 使用地址栏跳转页面
- 点击
★添加书签可添加自定义名称书签 - 点击书签列表跳转页面
- 点击
✖删除书签删除选中书签 - 点击
📂切换书签隐藏/显示书签列表 - 点击
全屏/退出切换全屏
步骤 7:书签持久化
- 所有书签会保存到 项目目录下的
bookmarks.json - 下次启动会自动加载之前的书签
✅ 效果图
