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 模式、自定义控件等高级内容。

相关推荐
235161 小时前
【JVM】Java为啥能跨平台?JDK/JRE/JVM的关系?
java·开发语言·jvm·spring boot·后端·spring·职场和发展
2401_860319521 小时前
【无标题】
开发语言·学习·rust
小裕哥略帅2 小时前
订单管理--实时算出在途数量、收货数量、到货数量、已发货数量和未发货数量
java·开发语言
_OP_CHEN2 小时前
C++进阶:(五)map系列容器的全面解析
开发语言·c++·map·红黑树·stl容器·键值对·mapoj题
大米粥哥哥2 小时前
c++ libcurl报错Send failed since rewinding of the data stream failed【已解决】
开发语言·c++·http·curl·rewind
Nebula_g2 小时前
C语言应用实例:解方程(二分查找)
c语言·开发语言·学习·算法·二分查找·基础
散峰而望2 小时前
C语言刷题-编程(一)(基础)
c语言·开发语言·编辑器
Dxxyyyy3 小时前
零基础学JAVA--Day27(注释+异常+异常处理方法)
java·开发语言
好望角雾眠3 小时前
第四阶段C#通讯开发-5:TCP
网络·笔记·网络协议·tcp/ip·c#
InCerry3 小时前
.NET周刊【11月第1期 2025-11-02】
c#·.net周报·.net周刊