【源码项目】简单实现的WPF浏览器,有兴趣的可以自己扩展(带源码)

简单实现的WPF浏览器,有兴趣的可以自己扩展(带源码)


完整的 WPF 嵌入式浏览器项目(CefSharp)+ 前进/后退/刷新 + 全屏 + 可隐藏书签 + 自定义书签名称 + 动态增删书签 的详细步骤,从零开始搭建并运行。


步骤 1:创建 WPF 项目

  1. 打开 Visual Studio 2022 或 2023
  2. 点击 创建新项目 → WPF App (.NET 8)
  3. 项目名称:EmbeddedBrowserApp
  4. 保存位置:任意目录
  5. 框架选择:.NET 6.0
  6. 创建完成后,解决方案中会生成 App.xamlMainWindow.xaml

步骤 2:安装 CefSharp

  1. 打开 NuGet 包管理器 → 管理解决方案的 NuGet 包

  2. 搜索并安装以下两个包(版本选择最新稳定版本,支持 .NET 8):

    • CefSharp.Wpf
    • CefSharp.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:运行项目

  1. 编译项目,如果 NuGet 包安装正确,应该没有报错
  2. 启动项目,默认加载 http://localhost:8080
  3. 使用地址栏跳转页面
  4. 点击 ★添加书签 可添加自定义名称书签
  5. 点击书签列表跳转页面
  6. 点击 ✖删除书签 删除选中书签
  7. 点击 📂切换书签 隐藏/显示书签列表
  8. 点击 全屏/退出 切换全屏

步骤 7:书签持久化

  • 所有书签会保存到 项目目录下的 bookmarks.json
  • 下次启动会自动加载之前的书签

✅ 效果图

相关推荐
c#上位机3 小时前
wpf之数据类型转换
c#·wpf·mvvm
清风徐来Groot6 小时前
WPF之布局
wpf
张人玉6 小时前
WPF 控件速查 PDF 笔记(可直接落地版)
笔记·microsoft·wpf
“抚琴”的人16 小时前
C# 取消机制(CancellationTokenSource/CancellationToken)
开发语言·c#·wpf·1024程序员节·取消机制
清风徐来Groot1 天前
WPF之Style
wpf
rollingman1 天前
WPF GroupBox 淡入淡出
wpf
yy7634966681 天前
WPF 之 简单高效的Revit多语言支持方案
java·大数据·linux·服务器·wpf
张人玉2 天前
WPF 触发器详解:定义、种类与示例
c#·wpf·1024程序员节·布局控件
rollingman2 天前
WPF ComboBox 样式
wpf·combobox·textbox