WPF编程宝典——C# 2010版源码详解

部署运行你感兴趣的模型镜像

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:WPF是.NET Framework的关键部分,用于丰富的用户界面开发。本书通过详尽的源码案例,为开发者提供深入理解WPF概念和技术的途径。涵盖了XAML基础、控件与布局、数据绑定、资源和样式、图形与动画、事件与命令、依赖属性与附加属性、通信与数据交换、控件扩展与自定义控件、集成Visual Studio 2010等多个方面的实际应用。通过学习这些源码,开发者能够加深对WPF框架的理解,并学习到项目开发中的最佳实践,提高编程和项目实施能力。 WPF

1. WPF编程与.NET Framework

在当今的应用程序开发领域中,WPF(Windows Presentation Foundation)以其强大的功能和美观的用户界面设计能力脱颖而出。WPF作为.NET Framework的一个重要组成部分,为开发者提供了构建交互式桌面应用程序的强大工具集。通过WPF,开发者可以利用.NET Framework的丰富库和功能,实现用户界面的复杂布局和交互逻辑。

WPF编程不仅仅是学习XAML(可扩展应用程序标记语言)和C#语言的简单组合,它还涉及到对.NET Framework中诸如资源管理、数据绑定以及多线程等概念的深入理解。由于WPF采用了现代的编程范式,比如MVVM(Model-View-ViewModel)架构模式,使得应用程序的维护和测试变得更加容易。

WPF的核心优势之一是它将用户界面的逻辑和代码分离,这意味着设计师和开发人员可以并行工作,同时提高应用程序的可测试性和可扩展性。随着本章的深入,你将会对WPF编程的基本概念有一个清晰的理解,并为探索WPF的深层次功能打下坚实的基础。让我们开始这段旅程,深入了解WPF编程的魅力吧。

2.1 XAML语言基础

XAML(Extensible Application Markup Language)是一种基于XML的标记语言,用于定义WPF应用程序的用户界面。它提供了一种简洁明了的方式来描述对象和它们之间的关系,以及设置这些对象的属性。XAML作为.NET Framework中WPF技术的核心,使开发人员能够以声明式的方式构建复杂的UI界面。

2.1.1 XAML元素和属性

在WPF应用程序中,几乎所有的UI元素都可以通过XAML来声明和配置。XAML元素对应于.NET Framework中的类,而XAML属性则映射到这些类的公共属性。例如,在XAML中定义一个 Button 控件,会涉及到使用 Button 元素,并设置其 Content 属性来指定按钮显示的文本。

<Button Content="Click Me" />

在上面的XAML代码中, <Button> 是一个XAML元素,它定义了UI中的一个按钮。 Content 属性指定了按钮上显示的文本内容。

2.1.2 XAML事件处理

事件是WPF编程中处理用户交互的关键。在XAML中,可以通过添加事件处理器来响应用户事件。事件处理器在XAML中通过属性语法声明,并指定一个处理该事件的方法。

<Button Content="Click Me" Click="OnButtonClick" />

在上述代码中, Click Button 控件的一个事件。 OnButtonClick 是XAML中声明的方法,该方法会在按钮被点击时执行。

2.1.3 命名空间和程序集引用

XAML可以包含来自不同源的组件和对象。为了引用这些对象,XAML使用命名空间(Namespaces)和程序集引用(Assembly References)。命名空间指定XAML文档中使用的类的来源,而程序集引用则指出包含这些类的实际DLL文件。

<Window xmlns:local="clr-namespace:MyApp.LocalControls">
    <local:MyCustomControl />
</Window>

在该例子中, local 是一个前缀,用于访问命名空间 clr-namespace:MyApp.LocalControls 。该命名空间定义了 MyCustomControl ,这是一个在 MyApp 项目中的本地自定义控件。

<Window x:Class="MyApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <Button Content="Click Me" Click="OnButtonClick" />
</Window>

在这个例子中, x sys 是两个不同的命名空间,分别用于访问WPF框架自身提供的控件和系统类。

通过了解XAML元素和属性、事件处理机制以及如何使用命名空间和程序集引用,开发者可以开始构建WPF应用程序的用户界面。接下来的章节将继续深入探讨如何使用XAML进行用户界面设计,并将介绍更多高级特性,比如样式和模板的应用。

3. ```

第三章:控件与布局管理

3.1 核心控件介绍

在构建WPF应用程序时,开发者会频繁使用各种核心控件,例如按钮、文本框、列表等。了解这些控件的特性和用途是构建功能完备用户界面的关键。

3.1.1 按钮、文本框和列表控件

按钮是用户界面中最基本的交互元素之一,它允许用户执行操作,如提交表单、执行命令或触发事件。在WPF中,按钮控件被封装在 Button 类中。开发者可以通过设置 Content 属性来定义按钮上显示的文本或图像。

<Button Content="Click Me!"/>

文本框( TextBox )允许用户输入和编辑文本。它支持多种文本格式,例如单行文本、多行文本以及密码等。文本框的使用非常灵活,可以根据需要设置为只读或可编辑。

<TextBox Text="Default Text" Width="150"/>

列表控件是WPF中用于显示和管理数据集合的控件,如 ListBox ListView TreeView 等。每个列表控件都有一组独特的功能和布局方式,用于适应不同的应用场景。

<ListBox>
  <ListBoxItem>Item 1</ListBoxItem>
  <ListBoxItem>Item 2</ListBoxItem>
</ListBox>

3.1.2 数据显示控件

WPF中的数据显示控件允许以不同的方式展示数据集合。例如, DataGrid 控件用于创建复杂的表格视图,而 TreeView 控件用于以层次结构展示信息。数据绑定技术通常与这些控件一起使用,以实现动态数据展示。

<DataGrid AutoGenerateColumns="False">
  <DataGrid.Columns>
    <DataGridTextColumn Header="ID" Binding="{Binding Id}" />
    <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
  </DataGrid.Columns>
</DataGrid>

3.1.3 高级控件特性

WPF还提供了一些高级控件,如 ComboBox DatePicker TreeView 等,这些控件具备更复杂的用户交互功能。例如, ComboBox 结合了文本框和下拉列表的功能,允许用户在下拉列表中选择项,也可以直接输入文本。

<ComboBox>
  <ComboBoxItem>Item 1</ComboBoxItem>
  <ComboBoxItem>Item 2</ComboBoxItem>
</ComboBox>

3.2 布局控件详解

布局控件是管理多个控件在界面中位置和大小的关键,WPF提供了多种布局控件来满足不同的布局需求。

3.2.1 StackPanel和WrapPanel

StackPanel 将子元素垂直或水平地排列成一条线,而 WrapPanel 则是将子元素按顺序排列,并在一行排满后换行。

<StackPanel Orientation="Vertical">
  <Button Content="Button 1"/>
  <Button Content="Button 2"/>
  <!-- More buttons... -->
</StackPanel>

3.2.2 Grid和Canvas布局

Grid 控件提供了一个基于行和列的网格系统,允许开发者精确定义控件的位置和大小。它是最灵活的布局控件之一,适用于复杂的布局需求。

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="*"/>
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="150"/>
    <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions>
  <TextBlock Grid.Row="0" Grid.Column="0" Text="Header"/>
  <!-- More content... -->
</Grid>

Canvas 布局则是允许子元素绝对定位,可以使用 Canvas.Left Canvas.Top 等附加属性来指定子元素的具体位置。这种布局方式类似于HTML中的定位,适合于简单的布局或特定的布局需求。

<Canvas>
  <Rectangle Canvas.Left="10" Canvas.Top="10" Width="100" Height="50" Fill="Red"/>
</Canvas>

3.2.3 自定义布局控件

当WPF内置的布局控件无法满足特定需求时,开发者可以创建自定义布局控件。自定义布局控件通过继承自 Panel 类并重写其 MeasureOverride ArrangeOverride 方法来实现。

通过自定义布局控件,开发者可以实现全新的布局逻辑,例如基于数据的动态布局、复杂形状的排列等。

public class CustomLayoutControl : Panel
{
    protected override Size MeasureOverride(Size availableSize)
    {
        // 测量子元素并计算布局所需的总尺寸
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        // 根据测量结果安排子元素的位置和大小
    }
}

通过这些章节的内容,我们逐步深入了解了WPF核心控件和布局管理的精髓。每个控件和布局都有其独特的用法和设计哲学。这些知识点将为构建复杂的WPF应用程序打下坚实的基础。在实际开发中,开发者需要灵活运用这些控件和布局技术,以构建出既美观又实用的用户界面。

下一章,我们将进一步探讨WPF中的数据绑定技术以及MVVM模式的实现,这些知识将帮助开发者在WPF中构建更动态、更易于维护的应用程序。


# 4. 数据绑定与MVVM模式

## 4.1 数据绑定基础

### 4.1.1 数据绑定的基本概念

数据绑定是WPF应用程序中一种将界面元素(如文本框、列表等控件)与数据源连接起来的技术。其核心思想是数据源驱动界面的更新,当数据源的值发生变化时,绑定的界面元素也会自动更新。

在WPF中,数据绑定通常通过`Binding`类来实现,其基本结构如下:

```csharp
Binding binding = new Binding("PropertyName");
myElement.SetBinding(DependencyProperty, binding);

这里的 PropertyName 是你要绑定的数据源中的属性名称。 DependencyProperty 是目标WPF元素的依赖属性。依赖属性是WPF中一个核心概念,它使得属性值可以被动态地依赖和更新。

4.1.2 数据绑定的高级用法

数据绑定不仅限于简单属性的绑定,还可以进行复杂的转换、验证和同步。以下是几种常见的高级用法:

  1. 数据转换器(Data Converters) :允许你将数据源中的值转换为界面元素能够使用的格式,或者相反。例如,你可能需要将日期数据源显示为更友好的格式。
public class DateConverter : IValueConverter {
    public object Convert(object value, Type targetType, ...) {
        // 实现转换逻辑
    }
    public object ConvertBack(...) {
        // 实现从界面反向转换到数据源的逻辑
    }
}
  1. 验证(Validation) :数据绑定还支持在将数据输入到数据源之前进行验证,这在开发企业级应用时非常重要。
public class MyValidator : ValidationRule {
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) {
        // 进行数据验证
        ...
    }
}
  1. 源更新模式(Update Source Triggers) :控制何时数据源会被更新。例如,你可以设置当用户离开字段时更新,或者实时更新。

4.1.3 数据模板和值转换器

数据模板(Data Templates)和值转换器(Value Converters)是扩展数据绑定功能的两个关键组件:

  • 数据模板 :允许你定义一个自定义的布局结构,用于在界面上展示数据对象。使用 DataTemplate 可以在不同的上下文中重用布局结构。
<DataTemplate x:Key="MyDataTemplate">
    <StackPanel Orientation="Vertical">
        <TextBlock Text="{Binding Name}" />
        <TextBlock Text="{Binding Description}" />
    </StackPanel>
</DataTemplate>
  • 值转换器 :用于在绑定过程中改变数据值的类型或格式。比如,你可能需要将布尔值转换为“是/否”的字符串。

使用值转换器,你需要在XAML中定义转换器的实例,并在绑定表达式中引用它。

4.2 MVVM模式的实现

4.2.1 MVVM模式的基本原理

MVVM模式是一种特别适合于WPF应用程序的架构设计模式,它将应用程序的UI逻辑和业务逻辑分离开来。MVVM模式由以下三个部分构成:

  • Model :表示应用的数据结构。它对应于应用程序的数据实体或数据访问层。
  • View :是用户界面。这是最终用户与之交互的界面部分,也称为UI层。
  • ViewModel :作为View和Model之间的桥梁,它处理用户界面的交互逻辑,并更新View和Model。

4.2.2 视图模型的创建与绑定

视图模型是一个非常重要的组件,它负责将数据绑定到视图中。创建视图模型时,通常继承自 ViewModelBase 类,该类提供了属性更改通知等功能。

public class MyViewModel : ViewModelBase {
    private string _myProperty;
    public string MyProperty {
        get { return _myProperty; }
        set {
            if (_myProperty != value) {
                _myProperty = value;
                OnPropertyChanged("MyProperty");
            }
        }
    }
}

将视图模型绑定到视图中,你可以使用 DataContext 属性:

<Window x:Class="MyApp.MainWindow"
        ...
        DataContext="{Binding MyViewModel}">
    ...
</Window>

4.2.3 命令模式与事件处理

在MVVM模式中,命令模式(Command Pattern)常用来处理UI中的用户交互。这种模式将方法的调用封装成一个命令对象,命令对象可以绑定到按钮或其他控件的事件上。

public class MyCommand : ICommand {
    public event EventHandler CanExecuteChanged;

    public bool CanExecute(object parameter) {
        // 根据参数判断命令是否可以执行
        ...
    }

    public void Execute(object parameter) {
        // 执行命令
        ...
    }
}

通过命令模式,你可以将视图中的按钮点击事件与视图模型中的方法关联起来,从而实现逻辑的分离。

<Button Command="{Binding MyCommand}" Content="Click Me" />

使用命令模式,可以在不直接操作UI元素的情况下,控制用户界面的逻辑,这极大地提高了应用程序的可维护性和可测试性。

5. 资源和样式的定义与应用

资源和样式在WPF应用程序中扮演着至关重要的角色。它们不仅有助于保持用户界面的一致性,而且增加了代码的可维护性和可重用性。在本章中,我们将深入探讨如何在WPF中定义和应用样式,以及如何通过资源字典管理和共享资源。

5.1 样式与模板的应用

样式和控件模板为WPF提供了丰富的灵活性,允许开发者创建可重用和可定制的UI元素。这些特性是实现一致视觉体验的关键。

5.1.1 样式的定义与应用

样式允许开发者定义一组属性值,这些属性值可以应用到多个控件上,以实现界面的一致性。例如,如果你希望所有的按钮都具有相同的背景颜色和字体样式,你可以创建一个样式来实现这一目标。

在WPF中,样式可以使用XAML进行定义,并且可以引用资源字典中的资源。样式可以针对特定类型或类型的所有实例进行定义,并且可以基于触发器改变样式。

<Window.Resources>
    <Style x:Key="CustomButtonStyle" TargetType="{x:Type Button}">
        <Setter Property="Background" Value="LightBlue" />
        <Setter Property="Foreground" Value="White" />
        <Setter Property="FontSize" Value="14" />
        <!-- 其他设置 -->
    </Style>
</Window.Resources>

在这个样式中,我们定义了一个针对Button类型的样式,设置了按钮的背景色、前景色和字体大小。要应用这个样式,只需将Style属性绑定到Button上。

<Button Style="{StaticResource CustomButtonStyle}" Content="Click Me" />

5.1.2 创建控件模板

控件模板是一种特殊类型的样式,它定义了控件的外观。通过修改控件模板,开发者可以改变控件的外观而不改变其行为。模板通常包含视觉树,可以定义控件的视觉结构,如边框、形状等。

例如,创建一个自定义的CheckBox模板可能会涉及定义其checked和unchecked状态的视觉表示。

<Window.Resources>
    <ControlTemplate x:Key="CustomCheckBoxTemplate" TargetType="{x:Type CheckBox}">
        <!-- 控件模板的视觉树 -->
    </ControlTemplate>
</Window.Resources>

要使用自定义模板,将CheckBox的Template属性指向此模板。

<CheckBox Template="{StaticResource CustomCheckBoxTemplate}" Content="Option 1" />

5.1.3 样式继承与冲突解析

样式继承允许子控件从父控件继承样式。这在构建应用程序时非常有用,可以避免重复样式定义。样式冲突解决机制确保了在多个样式可能应用到同一控件时,正确的样式会被应用。

当存在多个样式目标同一属性时,WPF使用一定的优先级规则来解决冲突。例如,内联样式优先级最高,其次是应用于特定元素的样式,然后是应用于类型的样式。当两个样式具有相同的优先级时,最后定义的样式会覆盖先前的定义。

5.2 资源的管理与应用

资源字典是WPF中用于管理和共享资源的一种机制。通过资源字典,开发者可以将图像、数据模板、样式和其他对象定义为资源,并在应用程序的不同部分中轻松访问这些资源。

5.2.1 资源字典的使用

资源字典可以通过XAML或代码后端进行定义,并且可以在应用程序、窗口或用户控件级别进行组织。将资源添加到字典中,可以通过键值对的方式进行。

<Window.Resources>
    <ResourceDictionary>
        <BitmapImage x:Key="AppLogo" UriSource="Assets/AppLogo.png" />
        <!-- 其他资源 -->
    </ResourceDictionary>
</Window.Resources>

要访问存储在资源字典中的资源,可以使用静态资源关键字StaticResource,并提供资源的键。

<Image Source="{StaticResource AppLogo}" />

5.2.2 资源的动态加载与合并

动态加载资源是指在运行时动态地添加资源到资源字典中。这可以通过编程方式使用ResourceDictionary类来实现。合并资源字典允许将多个资源字典合并为一个,这样可以在运行时动态地改变应用程序的资源集。

ResourceDictionary resourceDict1 = new ResourceDictionary();
resourceDict1.Source = new Uri("Dictionary1.xaml", UriKind.Relative);
ResourceDictionary resourceDict2 = new ResourceDictionary();
resourceDict2.Source = new Uri("Dictionary2.xaml", UriKind.Relative);

// 合并资源字典
resourceDict1.MergedDictionaries.Add(resourceDict2);

在合并时,若存在键名相同的资源,后合并的资源字典中的资源将覆盖先前的。

5.2.3 系统资源与自定义资源

WPF提供了丰富的系统资源,这些资源在全局范围内可用,并且可以被应用程序直接使用。例如,系统资源包括默认的颜色、字体和其他视觉设置。自定义资源则是开发者根据应用程序的需求创建的资源。

自定义资源和系统资源都可以被覆盖。如果一个自定义资源的键与系统资源的键相同,那么自定义资源将会优先使用。

<!-- 应用自定义颜色资源覆盖系统资源 -->
<Color x:Key="{x:Static SystemColors.HighlightColorKey}" R="255" G="255" B="0" />

在上述XAML代码中,我们将系统资源 HighlightColorKey 的值覆盖为黄色。通过这种方式,我们可以定制应用程序的外观,使其更好地融入整体的设计主题。

通过上述详细介绍,我们可以看到资源和样式的定义与应用为WPF开发人员提供了强大的工具来维护UI的一致性,并且在应用程序的开发过程中实现了灵活性和可定制性。在下一章节中,我们将继续探索WPF的图形绘制与动画创建,进一步丰富我们的应用程序。

6. 图形绘制与动画创建

WPF不仅仅是一个UI框架,它还包含了一系列强大的图形和动画功能,使得开发者能够创建出既美观又具有动态交互性的应用程序。本章将深入探索WPF中图形绘制技术和动画系统。

6.1 2D图形绘制技术

WPF提供了广泛API来实现2D图形的绘制,允许开发者用代码在界面上直接绘制图形。让我们从最基础的图形开始。

6.1.1 基本图形绘制

WPF中的 DrawingContext 类提供了绘制基本图形的方法,如矩形、椭圆、线条等。以下代码展示了如何在 DrawingCanvas 中绘制一个矩形:

public void DrawRectangle(DrawingCanvas canvas)
{
    using (DrawingContext ctx = canvas.RenderOpen())
    {
        ctx.DrawRectangle(Brushes.SteelBlue, null, new Rect(50, 50, 100, 50));
    }
}

6.1.2 路径和几何图形

路径(Path)是一个非常灵活的图形绘制工具,能够通过一个几何图形对象来定义复杂的形状。使用路径,可以绘制封闭图形、线条甚至是贝塞尔曲线等。

<Path Stroke="Black" StrokeThickness="2" Fill="Green">
    <Path.Data>
        <CombinedGeometry GeometryCombineMode="Xor">
            <CombinedGeometry.Geometry1>
                <RectangleGeometry Rect="50,50 100,100"/>
            </CombinedGeometry.Geometry1>
            <CombinedGeometry.Geometry2>
                <EllipseGeometry Center="100,100" RadiusX="50" RadiusY="50"/>
            </CombinedGeometry.Geometry2>
        </CombinedGeometry>
    </Path.Data>
</Path>

6.1.3 矢量图形和位图的整合

在WPF中,矢量图形和位图可以轻松整合在一起。利用 DrawingImage BitmapImage ,可以将它们嵌入到 Image 控件中显示,也可以在绘制过程中使用它们。

var bitmapImage = new BitmapImage(new Uri("path_to_image.png", UriKind.Relative));
var drawingImage = new DrawingImage(new GeometryDrawing(Brushes.Black, null, new RectangleGeometry(new Rect(0, 0, 100, 100))));
drawingImage.BeginInit();
drawingImage.ImageSource = bitmapImage;
drawingImage.EndInit();

// 然后可以在绘制操作中使用这个drawingImage

6.2 动画效果的实现

动画是WPF用户体验的关键部分之一。WPF提供了一套非常强大的动画系统,支持属性动画、关键帧动画以及复杂动画序列的构建。

6.2.1 动画的基本概念和分类

WPF中的动画主要分为三种:简单的属性动画、关键帧动画和故事板动画。以下是一个简单的属性动画示例:

// 创建DoubleAnimation以改变元素的Width属性
DoubleAnimation widthAnimation = new DoubleAnimation
{
    From = 100, // 初始值
    To = 300, // 目标值
    Duration = TimeSpan.FromSeconds(2) // 持续时间
};

// 将动画应用到UI元素的Width属性
myElement.BeginAnimation(FrameworkElement.WidthProperty, widthAnimation);

6.2.2 关键帧动画和故事板

关键帧动画允许在特定时间点设置属性值,为动画过程中的关键帧提供更细粒度的控制。

var sb = new Storyboard();
var keyFrameAnimation = new DoubleAnimationUsingKeyFrames();
keyFrameAnimation.KeyFrames.Add(new SplineDoubleKeyFrame { KeyTime = TimeSpan.FromSeconds(0), Value = 0 });
keyFrameAnimation.KeyFrames.Add(new SplineDoubleKeyFrame { KeyTime = TimeSpan.FromSeconds(1), Value = 300 });
keyFrameAnimation.BeginTime = TimeSpan.FromSeconds(1); // 开始时间

Storyboard.SetTarget(keyFrameAnimation, myElement);
Storyboard.SetTargetProperty(keyFrameAnimation, new PropertyPath("Height"));
sb.Children.Add(keyFrameAnimation);
sb.Begin();

6.2.3 动画在控件中的应用示例

控件是动画的主要应用对象。比如,可以在按钮点击事件中触发动画,实现一些视觉效果,如颜色变化、大小缩放、透明度改变等。

private void myButton_Click(object sender, RoutedEventArgs e)
{
    DoubleAnimation scaleAnimation = new DoubleAnimation
    {
        From = 1.0, // 初始值
        To = 1.5, // 缩放比例
        Duration = TimeSpan.FromSeconds(1), // 持续时间
        AutoReverse = true // 自动反转
    };

    myButton.BeginAnimation(Button.ScaleXProperty, scaleAnimation);
    myButton.BeginAnimation(Button.ScaleYProperty, scaleAnimation);
}

通过理解WPF的图形绘制和动画创建,开发人员将能够充分利用WPF的潜力,为应用程序创造出更吸引人的用户界面。接下来的章节将展示更多高级动画技术,如动画触发器和自定义动画行为。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:WPF是.NET Framework的关键部分,用于丰富的用户界面开发。本书通过详尽的源码案例,为开发者提供深入理解WPF概念和技术的途径。涵盖了XAML基础、控件与布局、数据绑定、资源和样式、图形与动画、事件与命令、依赖属性与附加属性、通信与数据交换、控件扩展与自定义控件、集成Visual Studio 2010等多个方面的实际应用。通过学习这些源码,开发者能够加深对WPF框架的理解,并学习到项目开发中的最佳实践,提高编程和项目实施能力。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

您可能感兴趣的与本文相关的镜像

Qwen-Image

Qwen-Image

图片生成
Qwen

Qwen-Image是阿里云通义千问团队于2025年8月发布的亿参数图像生成基础模型,其最大亮点是强大的复杂文本渲染和精确图像编辑能力,能够生成包含多行、段落级中英文文本的高保真图像

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值