c#WPF基础知识

一、WPF 基础概念

  1. 什么是 WPF

    • WPF(Windows Presentation Foundation)是微软推出的 UI 框架,用于开发 Windows 客户端应用程序。

    • 核心优势:基于 Direct3D 渲染,视觉效果比 WinForm 更丰富的视觉效果;支持界面与逻辑分离,便于维护。

    • 属于.NET Framework 的一部分(3.0 及以上版本),兼容.NET 生态系统。

  2. WPF 与 WinForm 的区别

    特性 WPF WinForm
    渲染引擎 Direct3D(硬件加速) GDI+(软件渲染)
    界面描述 XAML(声明式)+ C# 纯 C# 代码(命令式)
    数据绑定 强大的内置数据绑定机制 需手动实现数据同步
    扩展性 支持自定义控件、模板、动画 扩展能力有限

二、XAML 基础

  1. XAML 简介

    • 全称:Extensible Application Markup Language(可扩展应用程序标记语言)。

    • 作用:用标记语言描述界面,实现 "界面(XAML)" 与 "逻辑(C#)" 分离。

    • 文件格式:以.xaml为扩展名,本质是 XML 文件。

  2. XAML 语法规则

    • 标签类型

      • 双标签:<标签名>内容</标签名>(如<Button>点击我</Button>

      • 单标签:<标签名/>(如<Separator/>,无内容时使用)

    • 属性 :以键值对形式定义在开始标签中,如<Button Content="确定" Width="100"/>

    • 命名空间(xmlns)

      :类似 C# 的using,用于引入控件库,默认命名空间:

      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" <!-- WPF控件 --> xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" <!-- XAML扩展 -->

三、WPF 项目结构

一个基础 WPF 项目包含以下核心文件:

  1. App.xaml + App.xaml.cs

    • 应用程序入口,定义全局配置(如启动窗口、资源字典)。

    • 示例:指定启动窗口为MainWindow

      复制代码
      <Application x:Class="WpfApp1.App"
                   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                   StartupUri="MainWindow.xaml">  <!-- 启动窗口 -->
      </Application>
  2. MainWindow.xaml + MainWindow.xaml.cs

    • MainWindow.xaml:主窗口的界面布局(XAML 描述)。

    • MainWindow.xaml.cs:窗口的交互逻辑(C# 代码),与 XAML 通过x:Class关联。

四、布局控件

布局控件用于管理界面中控件的排列方式,常用布局:

  1. Grid(网格布局)

    • 按行和列划分区域,最常用的布局控件。

    • 示例:2 行 1 列的网格,包含一个按钮和文本框

      复制代码
      <Grid>
          <Grid.RowDefinitions>
              <RowDefinition Height="50"/>  <!-- 第一行高度50 -->
              <RowDefinition Height="*"/>   <!-- 第二行占剩余空间 -->
          </Grid.RowDefinitions>
          <Button Grid.Row="0" Content="按钮"/>  <!-- 放在第1行 -->
          <TextBox Grid.Row="1" Text="文本框"/>  <!-- 放在第2行 -->
      </Grid>
  2. StackPanel(栈式布局)

    • 控件按水平(Orientation="Horizontal")或垂直(默认)方向排列。

    • 示例:垂直排列两个按钮

      复制代码
      <StackPanel>
          <Button Content="按钮1" Margin="5"/>
          <Button Content="按钮2" Margin="5"/>
      </StackPanel>
  3. Canvas(画布布局)

    • 控件通过Canvas.LeftCanvas.Top属性指定绝对位置,适合自定义绘制。

五、常用控件

  1. 基础控件

    • Button:按钮,响应点击事件。

    • TextBox:文本输入框,Text属性获取 / 设置内容。

    • Label:静态文本显示,Content属性设置文本。

    • CheckBox:复选框,IsChecked属性判断是否选中。

    • RadioButton:单选按钮,同组内互斥(通过GroupName分组)。

  2. 列表类控件

    • ListBox:列表框,ItemsSource绑定数据源,SelectedItem获取选中项。

    • ComboBox:下拉列表,用法类似ListBox

六、数据绑定

数据绑定是 WPF 的核心功能,实现控件与数据的自动同步。

  1. 基本语法

    • 在 XAML 中用

      复制代码
      {Binding 路径}

      绑定数据,例如:

      复制代码
      <TextBox Text="{Binding UserName}"/>  <!-- 绑定到数据源的UserName属性 -->
  2. 设置数据源(DataContext)

    • 需为控件或窗口指定

      复制代码
      DataContext(数据源),通常是一个 C# 对象:
      // 后台代码
      public class User {
          public string UserName { get; set; } = "张三";
      }
      
      public MainWindow() {
          InitializeComponent();
          this.DataContext = new User();  // 设置数据源
      }

七、事件与命令

  1. 事件处理

    • XAML 中通过事件名="方法名"绑定事件,例如按钮点击:

      复制代码
      <Button Content="点击" Click="Button_Click"/>
    • 后台代码实现事件逻辑:

      private void Button_Click(object sender, RoutedEventArgs e) { MessageBox.Show("按钮被点击了!"); }

  2. 命令(Command)

    • 解耦控件与逻辑,适合 MVVM 模式,常用ICommand接口。

八、样式与模板

  1. 样式(Style)

    • 统一控件外观,可定义在Resources中复用:

      复制代码
      <Window.Resources>
          <!-- 全局按钮样式 -->
          <Style TargetType="Button">
              <Setter Property="Background" Value="LightBlue"/>
              <Setter Property="FontSize" Value="14"/>
          </Style>
      </Window.Resources>
      
      <!-- 使用样式(自动应用) -->
      <Button Content="样式按钮"/>
  2. 模板(Template)

    • 自定义控件结构,例如将按钮改为圆形:

      复制代码
      <Button Content="圆形按钮">
          <Button.Template>
              <ControlTemplate TargetType="Button">
                  <Ellipse Fill="{TemplateBinding Background}" Width="100" Height="100">
                      <TextBlock Text="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                  </Ellipse>
              </ControlTemplate>
          </Button.Template>
      </Button>

九、动画基础

WPF 支持通过Storyboard创建动画,示例:按钮宽度从 100 动画到 300

复制代码
<Button Content="动画按钮" Width="100">
    <Button.Triggers>
        <EventTrigger RoutedEvent="Button.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation 
                        Storyboard.TargetProperty="Width" 
                        From="100" To="300" Duration="0:0:1"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Button.Triggers>
</Button>

十、学习资源

掌握这些基础知识后,可进一步学习 MVVM 模式、自定义控件等高级内容。

相关推荐
std78793 小时前
Rust 与 Go – 比较以及每个如何满足您的需求
开发语言·golang·rust
报错小能手3 小时前
python(入门)map内置函数及import模块导入,as别名
开发语言·人工智能·python
梵得儿SHI3 小时前
Java 反射机制实战:对象属性复制与私有方法调用全解析
java·开发语言·java反射机制的实际应用·对象属性复制·反射调用私有方法·私有字段·类型兼容性和敏感字段忽略
sulikey3 小时前
C++的STL:深入理解 C++ 的 std::initializer_list
开发语言·c++·stl·list·initializerlist·c++标准库
liu****3 小时前
19.map和set的封装
开发语言·数据结构·c++·算法
孤廖3 小时前
C++ 模板再升级:非类型参数、特化技巧(含全特化与偏特化)、分离编译破解
linux·服务器·开发语言·c++·人工智能·后端·深度学习
润 下3 小时前
C语言——回调函数的典型示例(分析详解)
c语言·开发语言·人工智能·经验分享·笔记·程序人生
朝新_3 小时前
【EE初阶 - 网络原理】传输层协议
java·开发语言·网络·笔记·javaee
前端架构师-老李4 小时前
Java开发—JDK的安装和版本管理(macOS)
java·开发语言·macos