编辑
2025-10-04
C#
00

在现代软件开发中,数据序列化和反序列化是非常重要的过程。它们允许我们将复杂的数据结构转换为可以轻松存储或传输的格式,然后再将其恢复为原始形式。在.NET生态系统中,Protobuf-net是一个强大而高效的序列化库,基于Google的Protocol Buffers。

本文将详细介绍Protobuf-net的使用方法,包括安装、基本用法、高级特性以及性能比较。

Protobuf-net简介

Protobuf-net是Protocol Buffers的.NET实现,它提供了一种高效、跨平台的序列化方式。与XML或JSON相比,Protobuf-net生成的数据更小,序列化和反序列化速度更快。

主要特点:

  • 高效的二进制格式
  • 跨语言和跨平台支持
  • 向后兼容性好
  • 支持.NET Framework、.NET Core和.NET Standard

安装Protobuf-net

要使用Protobuf-net,首先需要安装相关的NuGet包。可以通过以下方式安装:

  1. 使用NuGet包管理器GUI:
    • 在Visual Studio中,右键点击项目 -> 管理NuGet程序包
    • 搜索"protobuf-net"
    • 选择并安装最新版本
  2. 使用Package Manager Console:
C#
Install-Package protobuf-net
  1. 使用.NET CLI:
text
dotnet add package protobuf-net
编辑
2025-10-03
C#
00

概述

TabControl是WPF中常用的导航控件,通过合理使用布局技术,可以实现响应式的标签页界面。本文将详细介绍如何创建一个响应式的TabControl控件,并结合Grid、StackPanel等布局控件实现自适应效果。

TabControl 基本属性

布局和外观属性

  • TabStripPlacement: 设置选项卡标签的位置(Top/Bottom/Left/Right)
  • TabStripHeaderBackground: 设置选项卡头部的背景色
  • Background: 设置整个TabControl的背景色
  • BorderBrush: 设置边框颜色
  • BorderThickness: 设置边框粗细
  • Padding: 设置内边距
  • Margin: 设置外边距

内容控制属性

  • SelectedIndex: 获取或设置当前选中的选项卡索引
  • SelectedItem: 获取或设置当前选中的选项卡项
  • SelectedContent: 获取当前选中选项卡的内容
  • Items: 获取选项卡项的集合
  • ItemsSource: 设置选项卡数据源
  • ContentTemplate: 设置内容的模板

样式与模板属性

  • ItemTemplate: 定义选项卡项的模板
  • ItemContainerStyle: 设置选项卡容器的样式
  • ContentStringFormat: 设置内容的字符串格式
  • Template: 设置整个TabControl的控件模板

TabControl 常用方法

选项卡操作

  • SelectTab(): 选择指定的选项卡
  • GetSelectedTab(): 获取当前选中的选项卡
  • ClearValue(): 清除指定依赖属性的值

事件处理

  • OnSelectionChanged: 选项卡选择改变时触发
  • OnMouseDown: 鼠标按下事件
  • OnMouseUp: 鼠标抬起事件
  • OnGotFocus: 获得焦点事件
  • OnLostFocus: 失去焦点事件

TabItem 相关属性

  • Header: 设置选项卡标题
  • Content: 设置选项卡内容
  • IsSelected: 获取或设置是否选中
  • IsEnabled: 获取或设置是否启用
编辑
2025-10-03
C#
00

ScrollViewer 是WPF中的一个重要容器控件,它为内容提供滚动功能。与WinForm中的Panel.AutoScroll不同,ScrollViewer提供了更丰富的滚动特性和更好的可定制性。

基本特性

  • 支持水平和垂直滚动
  • 可自定义滚动条样式
  • 支持触摸滚动
  • 提供丰富的滚动事件

基础用法

简单示例

XML
<ScrollViewer Height="200" Width="300"> <!-- 内容区域 --> <StackPanel> <TextBlock Text="这是一段很长的内容..." TextWrapping="Wrap"/> <Button Content="按钮1"/> <Button Content="按钮2"/> <!-- 更多内容 --> </StackPanel> </ScrollViewer>

image.png

编辑
2025-10-03
C#
00

在WPF应用开发中,布局容器的选择对于界面设计至关重要。今天,我们将深入探讨最基础却非常实用的布局容器之一:Canvas

Canvas布局的核心优势

Canvas是WPF中最简单直观的布局容器,它提供了一种类似传统WinForm的绝对定位方式。对于从WinForm迁移到WPF的开发者来说,这种布局方式无疑是最容易上手的。

💡开发者提示:Canvas特别适合需要精确控制元素位置的场景,如图形编辑器、游戏界面等。

核心定位机制

在Canvas中,我们可以通过四个关键的附加属性来精确控制子元素的位置:

  • Canvas.Left- 控制元素左侧距离画布左边缘的距离
  • Canvas.Top- 控制元素顶部距离画布上边缘的距离
  • Canvas.Right- 控制元素右侧距离画布右边缘的距离
  • Canvas.Bottom- 控制元素底部距离画布下边缘的距离

主要特点:

  • 完全的绝对定位控制
  • 子元素位置不会随窗口大小改变而改变
  • 适合固定大小的界面设计
  • 类似于WinForm的控件布局方式

Canvas的基本用法

基础示例

XML
<Window x:Class="AppCanvas.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:AppCanvas" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Canvas> <!-- 在左上角放置一个按钮 --> <Button Canvas.Left="20" Canvas.Top="20" Content="按钮1" Width="100" Height="30"/> <!-- 在右上角放置一个文本框 --> <TextBox Canvas.Right="20" Canvas.Top="20" Width="150" Height="30" Text="示例文本"/> <!-- 在中间放置一个标签 --> <Label Canvas.Left="350" Canvas.Top="200" Content="这是一个标签"/> </Canvas> </Window>

image.png

编辑
2025-10-03
C#
00

WrapPanel是WPF中一个非常实用的布局控件,它能够按照水平或垂直方向依次排列子元素,当一行或一列放不下时会自动换行或换列。这种布局方式类似于HTML中的流式布局,在WinForm中没有直接对应的控件。

主要特点:

  • 支持水平和垂直两种排列方向
  • 自动换行/换列功能
  • 可以设置统一的项目大小
  • 灵活的对齐方式

WrapPanel的基本属性

C#
// WrapPanel的主要属性 public class WrapPanel : Panel { // 排列方向,默认为Horizontal public Orientation Orientation { get; set; } // 子元素的统一宽度 public double ItemWidth { get; set; } // 子元素的统一高度 public double ItemHeight { get; set; } }

基础使用示例

水平方向排列(默认)

XML
<Window x:Class="AppWrapPanel.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:AppWrapPanel" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <WrapPanel> <!-- 添加一系列按钮,当空间不足时会自动换行 --> <Button Content="按钮1" Margin="5" Width="100" Height="40"/> <Button Content="按钮2" Margin="5" Width="100" Height="40"/> <Button Content="按钮3" Margin="5" Width="100" Height="40"/> <Button Content="按钮4" Margin="5" Width="100" Height="40"/> <Button Content="按钮5" Margin="5" Width="100" Height="40"/> </WrapPanel> </Window>

image.png