当前位置: 首页 > article >正文

WPF高级 | WPF 3D 图形编程基础:创建立体的用户界面元素

在这里插入图片描述
在这里插入图片描述

WPF高级 | WPF 3D 图形编程基础:创建立体的用户界面元素

  • 一、前言
  • 二、WPF 3D 图形编程基础概念
    • 2.1 3D 坐标系
    • 2.2 模型(Model)
    • 2.3 材质(Material)
    • 2.4 变换(Transform)
  • 三、创建 3D 场景
    • 3.1 Viewport3D
    • 3.2 Camera(相机)
    • 3.3 Light(光源)
  • 四、创建基本的 3D 物体
    • 4.1 创建立方体
    • 4.2 创建球体
  • 五、动画与交互
    • 5.1 动画
    • 5.2 交互
  • 六、性能优化与注意事项
    • 6.1 性能优化
    • 6.2 注意事项
  • 七、实际应用案例
    • 7.1 工业设计展示
    • 7.2 虚拟现实(VR)和增强现实(AR)
  • 八、总结
  • 结束语
  • 优质源码分享

WPF高级 | WPF 3D 图形编程基础:创建立体的用户界面元素 ,在当今的软件开发领域,用户界面的设计越来越追求视觉上的丰富性和交互性。Windows Presentation Foundation(WPF)作为微软推出的新一代图形界面技术,不仅在 2D 图形处理上表现出色,还提供了强大的 3D 图形编程能力。通过 WPF 3D,开发者可以创建出立体的用户界面元素,为用户带来更加沉浸式的体验。本文将深入探讨 WPF 3D 图形编程的基础知识,通过丰富的代码示例和详细的概念解释,帮助读者掌握如何在 WPF 应用中创建立体的用户界面元素。

一、前言

    在数字浪潮汹涌澎湃的时代,程序开发宛如一座神秘而宏伟的魔法城堡,矗立在科技的浩瀚星空中。代码的字符,似那闪烁的星辰,按照特定的轨迹与节奏,组合、交织、碰撞,即将开启一场奇妙且充满无限可能的创造之旅。当空白的文档界面如同深邃的宇宙等待探索,程序员们则化身无畏的星辰开拓者,指尖在键盘上轻舞,准备用智慧与逻辑编织出足以改变世界运行规则的程序画卷,在 0 和 1 的二进制世界里,镌刻下属于人类创新与突破的不朽印记。

    在当今数字化时代,桌面应用程序的用户界面(UI)设计至关重要,它直接影响着用户体验与产品的竞争力。而 WPF(Windows Presentation Foundation)作为微软推出的一款强大的 UI 框架,其布局系统更是构建精美界面的核心要素。WPF 布局系统为开发者提供了丰富多样的布局方式,能够轻松应对各种复杂的界面设计需求,无论是简洁明了的工具软件,还是功能繁杂的企业级应用,都能借助其打造出令人惊艳的视觉效果与流畅的交互体验。

    WPF从入门到精通专栏,旨在为读者呈现一条从对 WPF(Windows Presentation Foundation)技术懵懂无知到精通掌握的学习路径。首先从基础入手,介绍 WPF 的核心概念,涵盖其独特的架构特点、开发环境搭建流程,详细解读布局系统、常用控件以及事件机制等基础知识,帮助初学者搭建起对 WPF 整体的初步认知框架。随着学习的深入,进阶部分聚焦于数据绑定、样式模板、动画特效等关键知识点,进一步拓展 WPF 开发的能力边界,使开发者能够打造出更为个性化、交互性强的桌面应用界面。高级阶段则涉及自定义控件开发、MVVM 设计模式应用、多线程编程等深层次内容,助力开发者应对复杂的业务需求,构建大型且可维护的应用架构。同时,通过实战项目案例解析,展示如何将所学知识综合运用到实际开发中,从需求分析到功能实现再到优化测试,全方位积累实践经验。此外,还探讨了性能优化、与其他技术集成以及安全机制等拓展性话题,让读者对 WPF 技术在不同维度有更深入理解,最终实现对 WPF 技术的精通掌握,具备独立开发高质量桌面应用的能力。

🛕 点击进入WPF从入门到精通专栏

在这里插入图片描述

二、WPF 3D 图形编程基础概念

2.1 3D 坐标系

    在 3D 图形编程中,首先需要了解 3D 坐标系。WPF 使用右手坐标系,即 X 轴向右,Y 轴向上,Z 轴向前。一个三维空间中的点可以用一个三元组 (x, y, z) 来表示。例如,点 (1, 2, 3) 表示在 X 轴正方向 1 个单位,Y 轴正方向 2 个单位,Z 轴正方向 3 个单位的位置。

// 创建一个三维点
Point3D point = new Point3D(1, 2, 3);

2.2 模型(Model)

    模型是 3D 场景中的基本元素,它定义了物体的形状和外观。在 WPF 中,常用的模型类型有MeshGeometry3D和GeometryModel3D。

    MeshGeometry3D:用于定义网格几何形状,它由一组三角形面组成。通过定义顶点、三角形面的索引、纹理坐标等信息,可以创建出各种复杂的形状。

MeshGeometry3D mesh = new MeshGeometry3D();
// 添加顶点
mesh.Positions.Add(new Point3D(0, 0, 0));
mesh.Positions.Add(new Point3D(1, 0, 0));
mesh.Positions.Add(new Point3D(0, 1, 0));
// 添加三角形面的索引
mesh.TriangleIndices.Add(0);
mesh.TriangleIndices.Add(1);
mesh.TriangleIndices.Add(2);

    GeometryModel3D:用于将几何形状与材质、变换等属性结合起来,形成一个完整的 3D 模型。

GeometryModel3D model = new GeometryModel3D();
model.Geometry = mesh;
// 设置材质
DiffuseMaterial material = new DiffuseMaterial(Brushes.Red);
model.Material = material;

2.3 材质(Material)

    材质定义了模型表面的外观特性,如颜色、纹理、光泽度等。WPF 提供了多种材质类型,如DiffuseMaterial(漫反射材质)、SpecularMaterial(镜面反射材质)、EmissiveMaterial(自发光材质)等。

    DiffuseMaterial:模拟物体表面对光线的漫反射效果,使物体看起来具有柔和的颜色。

DiffuseMaterial diffuseMaterial = new DiffuseMaterial(Brushes.Green);

    SpecularMaterial:模拟物体表面的镜面反射效果,使物体看起来有光泽。

SpecularMaterial specularMaterial = new SpecularMaterial(Brushes.White, 10); // 第二个参数为光泽度

    EmissiveMaterial:使物体看起来像是自发光的,不受光线影响。

EmissiveMaterial emissiveMaterial = new EmissiveMaterial(Brushes.Yellow);

2.4 变换(Transform)

    变换用于改变模型在 3D 空间中的位置、方向和大小。WPF 提供了多种变换类型,如TranslateTransform3D(平移变换)、RotateTransform3D(旋转变换)、ScaleTransform3D(缩放变换)等。

    TranslateTransform3D:将模型在 3D 空间中沿 X、Y、Z 轴进行平移。

TranslateTransform3D translateTransform = new TranslateTransform3D(1, 2, 3);
model.Transform = translateTransform;

    RotateTransform3D:使模型绕指定轴进行旋转。

AxisAngleRotation3D rotation = new AxisAngleRotation3D(new Vector3D(0, 1, 0), 45); // 绕Y轴旋转45度
RotateTransform3D rotateTransform = new RotateTransform3D(rotation);
model.Transform = rotateTransform;

    ScaleTransform3D:对模型进行缩放。

ScaleTransform3D scaleTransform = new ScaleTransform3D(2, 2, 2); // 沿X、Y、Z轴各缩放2倍
model.Transform = scaleTransform;

三、创建 3D 场景

3.1 Viewport3D

    Viewport3D是 WPF 中用于显示 3D 场景的控件,它充当了一个 3D 画布的角色。在 XAML 中,可以这样定义一个Viewport3D:

<Viewport3D>
    <!-- 3D场景内容将在这里添加 -->
</Viewport3D>

    在代码中,也可以动态创建Viewport3D并添加到界面中:

Viewport3D viewport = new Viewport3D();
this.Content = viewport;

3.2 Camera(相机)

    相机决定了我们观察 3D 场景的视角。WPF 提供了两种主要的相机类型:PerspectiveCamera(透视相机)和OrthographicCamera(正交相机)。

    PerspectiveCamera:模拟人眼的透视效果,远处的物体看起来比近处的物体小。

<PerspectiveCamera Position="0, 0, 5" LookDirection="0, 0, -1" UpDirection="0, 1, 0" FieldOfView="60" />

    在代码中创建:

PerspectiveCamera perspectiveCamera = new PerspectiveCamera();
perspectiveCamera.Position = new Point3D(0, 0, 5);
perspectiveCamera.LookDirection = new Vector3D(0, 0, -1);
perspectiveCamera.UpDirection = new Vector3D(0, 1, 0);
perspectiveCamera.FieldOfView = 60;
viewport.Camera = perspectiveCamera;

    OrthographicCamera:正交投影相机,物体在不同距离上的大小相同,常用于工程绘图等场景。

<OrthographicCamera Position="0, 0, 5" LookDirection="0, 0, -1" UpDirection="0, 1, 0" Width="10" />

    在代码中创建:

OrthographicCamera orthographicCamera = new OrthographicCamera();
orthographicCamera.Position = new Point3D(0, 0, 5);
orthographicCamera.LookDirection = new Vector3D(0, 0, -1);
orthographicCamera.UpDirection = new Vector3D(0, 1, 0);
orthographicCamera.Width = 10;
viewport.Camera = orthographicCamera;

3.3 Light(光源)

    光源用于照亮 3D 场景中的模型,使模型呈现出不同的明暗效果。WPF 提供了多种光源类型,如AmbientLight(环境光)、DirectionalLight(方向光)、PointLight(点光源)、SpotLight(聚光灯)等。

    AmbientLight:环境光均匀地照亮整个场景,没有特定的方向。

<AmbientLight Color="White" />

    在代码中创建:

AmbientLight ambientLight = new AmbientLight(Colors.White);
viewport.Children.Add(ambientLight);

    DirectionalLight:方向光从一个特定的方向照射过来,所有物体都受到相同方向的光照。

<DirectionalLight Color="White" Direction="0, -1, -1" />

    在代码中创建:

DirectionalLight directionalLight = new DirectionalLight(Colors.White, new Vector3D(0, -1, -1));
viewport.Children.Add(directionalLight);

    PointLight:点光源从一个点向四周发射光线,距离光源越近的物体越亮。

<PointLight Color="White" Position="0, 0, 5" />

    在代码中创建:

PointLight pointLight = new PointLight(Colors.White, new Point3D(0, 0, 5));
viewport.Children.Add(pointLight);

    SpotLight:聚光灯从一个点向一个特定的方向发射锥形光线,只有在锥形范围内的物体才会被照亮。

<SpotLight Color="White" Position="0, 0, 5" Direction="0, -1, -1" InnerConeAngle="10" OuterConeAngle="30" />

    在代码中创建:

SpotLight spotLight = new SpotLight(Colors.White, new Point3D(0, 0, 5), new Vector3D(0, -1, -1), 10, 30);
viewport.Children.Add(spotLight);

四、创建基本的 3D 物体

4.1 创建立方体

    立方体是最基本的 3D 物体之一。可以通过定义MeshGeometry3D的顶点和三角形面索引来创建立方体。

MeshGeometry3D cubeMesh = new MeshGeometry3D();
// 定义顶点
cubeMesh.Positions.Add(new Point3D(0, 0, 0));
cubeMesh.Positions.Add(new Point3D(1, 0, 0));
cubeMesh.Positions.Add(new Point3D(1, 1, 0));
cubeMesh.Positions.Add(new Point3D(0, 1, 0));
cubeMesh.Positions.Add(new Point3D(0, 0, 1));
cubeMesh.Positions.Add(new Point3D(1, 0, 1));
cubeMesh.Positions.Add(new Point3D(1, 1, 1));
cubeMesh.Positions.Add(new Point3D(0, 1, 1));
// 定义三角形面索引
cubeMesh.TriangleIndices.Add(0); cubeMesh.TriangleIndices.Add(1); cubeMesh.TriangleIndices.Add(2);
cubeMesh.TriangleIndices.Add(0); cubeMesh.TriangleIndices.Add(2); cubeMesh.TriangleIndices.Add(3);
cubeMesh.TriangleIndices.Add(4); cubeMesh.TriangleIndices.Add(5); cubeMesh.TriangleIndices.Add(6);
cubeMesh.TriangleIndices.Add(4); cubeMesh.TriangleIndices.Add(6); cubeMesh.TriangleIndices.Add(7);
cubeMesh.TriangleIndices.Add(0); cubeMesh.TriangleIndices.Add(4); cubeMesh.TriangleIndices.Add(5);
cubeMesh.TriangleIndices.Add(0); cubeMesh.TriangleIndices.Add(5); cubeMesh.TriangleIndices.Add(1);
cubeMesh.TriangleIndices.Add(1); cubeMesh.TriangleIndices.Add(5); cubeMesh.TriangleIndices.Add(6);
cubeMesh.TriangleIndices.Add(1); cubeMesh.TriangleIndices.Add(6); cubeMesh.TriangleIndices.Add(2);
cubeMesh.TriangleIndices.Add(2); cubeMesh.TriangleIndices.Add(6); cubeMesh.TriangleIndices.Add(7);
cubeMesh.TriangleIndices.Add(2); cubeMesh.TriangleIndices.Add(7); cubeMesh.TriangleIndices.Add(3);
cubeMesh.TriangleIndices.Add(3); cubeMesh.TriangleIndices.Add(7); cubeMesh.TriangleIndices.Add(4);
cubeMesh.TriangleIndices.Add(3); cubeMesh.TriangleIndices.Add(4); cubeMesh.TriangleIndices.Add(0);
// 创建GeometryModel3D
GeometryModel3D cubeModel = new GeometryModel3D();
cubeModel.Geometry = cubeMesh;
DiffuseMaterial cubeMaterial = new DiffuseMaterial(Brushes.Blue);
cubeModel.Material = cubeMaterial;
viewport.Children.Add(cubeModel);

4.2 创建球体

    创建球体相对复杂一些,可以使用数学公式来计算球体表面的顶点。下面是一个简单的示例,通过细分球体表面来近似创建球体。

int numLatitudes = 10;
int numLongitudes = 10;
MeshGeometry3D sphereMesh = new MeshGeometry3D();
for (int i = 0; i <= numLatitudes; i++)
{
    double latitude = i * Math.PI / numLatitudes;
    for (int j = 0; j <= numLongitudes; j++)
    {
        double longitude = j * 2 * Math.PI / numLongitudes;
        double x = Math.Sin(latitude) * Math.Cos(longitude);
        double y = Math.Sin(latitude) * Math.Sin(longitude);
        double z = Math.Cos(latitude);
        sphereMesh.Positions.Add(new Point3D(x, y, z));
    }
}
for (int i = 0; i < numLatitudes; i++)
{
    for (int j = 0; j < numLongitudes; j++)
    {
        int topLeft = i * (numLongitudes + 1) + j;
        int topRight = topLeft + 1;
        int bottomLeft = (i + 1) * (numLongitudes + 1) + j;
        int bottomRight = bottomLeft + 1;
        sphereMesh.TriangleIndices.Add(topLeft);
        sphereMesh.TriangleIndices.Add(bottomLeft);
        sphereMesh.TriangleIndices.Add(topRight);
        sphereMesh.TriangleIndices.Add(topRight);
        sphereMesh.TriangleIndices.Add(bottomLeft);
        sphereMesh.TriangleIndices.Add(bottomRight);
    }
}
// 创建GeometryModel3D
GeometryModel3D sphereModel = new GeometryModel3D();
sphereModel.Geometry = sphereMesh;
DiffuseMaterial sphereMaterial = new DiffuseMaterial(Brushes.Red);
sphereModel.Material = sphereMaterial;
viewport.Children.Add(sphereModel);

五、动画与交互

5.1 动画

    在 WPF 3D 中,可以使用动画来实现模型的动态效果,如移动、旋转、缩放等。通过Storyboard和DoubleAnimation等类,可以定义和控制动画的行为。

    例如,实现一个立方体绕 Y 轴旋转的动画:

<Window.Resources>
    <Storyboard x:Key="RotateCubeStoryboard">
        <DoubleAnimation
            Storyboard.TargetName="cubeModel"
            Storyboard.TargetProperty="(Model3D.Transform).(RotateTransform3D.Rotation).(AxisAngleRotation3D.Angle)"
            From="0"
            To="360"
            Duration="0:0:5"
            RepeatBehavior="Forever" />
    </Storyboard>
</Window.Resources>
<Viewport3D>
    <Viewport3D.Children>
        <ModelVisual3D x:Name="cubeModel">
            <!-- 立方体模型定义 -->
        </ModelVisual3D>
    </Viewport3D.Children>
</Viewport3D>

    在代码中启动动画:

Storyboard storyboard = (Storyboard)this.Resources["RotateCubeStoryboard"];
storyboard.Begin(this);

5.2 交互

    为了使 3D 场景具有交互性,可以使用鼠标和键盘事件来控制模型的行为。例如,通过鼠标拖动来旋转模型。

    首先,在 XAML 中为Viewport3D添加鼠标事件处理:

<Viewport3D MouseLeftButtonDown="Viewport3D_MouseLeftButtonDown"
            MouseMove="Viewport3D_MouseMove"
            MouseLeftButtonUp="Viewport3D_MouseLeftButtonUp">
    <!-- 3D场景内容 -->
</Viewport3D>

    然后,在代码中处理这些事件:

private bool isDragging;
private Point lastMousePosition;
private AxisAngleRotation3D rotation;
private void Viewport3D_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    isDragging = true;
    lastMousePosition = e.GetPosition(this);
    rotation = new AxisAngleRotation3D(new Vector3D(0, 1, 0), 0);
}
private void Viewport3D_MouseMove(object sender, MouseEventArgs e)
{
    if (isDragging)
    {
        Point currentMousePosition = e.GetPosition(this);
        double deltaX = currentMousePosition.X - lastMousePosition.X;
        rotation.Angle += deltaX;
        lastMousePosition = currentMousePosition;
        RotateTransform3D rotateTransform = new RotateTransform3D(rotation);
        cubeModel.Transform = rotateTransform;
    }
}

    按下键盘上的方向键来平移模型。在 XAML 中,为Viewport3D添加键盘事件处理:

<Viewport3D 
    MouseLeftButtonDown="Viewport3D_MouseLeftButtonDown"
    MouseMove="Viewport3D_MouseMove"
    MouseLeftButtonUp="Viewport3D_MouseLeftButtonUp"
    KeyDown="Viewport3D_KeyDown">
    <!-- 3D场景内容 -->
</Viewport3D>

    在代码中处理键盘事件:

private void Viewport3D_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.Key)
    {
        case Key.Up:
            // 沿Y轴正方向平移
            TranslateTransform3D translateUp = new TranslateTransform3D(0, 0.1, 0);
            cubeModel.Transform = new Transform3DGroup()
            {
                Children = 
                {
                    cubeModel.Transform,
                    translateUp
                }
            };
            break;
        case Key.Down:
            // 沿Y轴负方向平移
            TranslateTransform3D translateDown = new TranslateTransform3D(0, -0.1, 0);
            cubeModel.Transform = new Transform3DGroup()
            {
                Children = 
                {
                    cubeModel.Transform,
                    translateDown
                }
            };
            break;
        case Key.Left:
            // 沿X轴负方向平移
            TranslateTransform3D translateLeft = new TranslateTransform3D(-0.1, 0, 0);
            cubeModel.Transform = new Transform3DGroup()
            {
                Children = 
                {
                    cubeModel.Transform,
                    translateLeft
                }
            };
            break;
        case Key.Right:
            // 沿X轴正方向平移
            TranslateTransform3D translateRight = new TranslateTransform3D(0.1, 0, 0);
            cubeModel.Transform = new Transform3DGroup()
            {
                Children = 
                {
                    cubeModel.Transform,
                    translateRight
                }
            };
            break;
    }
}

    此外,还可以实现鼠标滚轮缩放模型的功能。在 XAML 中添加鼠标滚轮事件处理:

<Viewport3D 
    MouseLeftButtonDown="Viewport3D_MouseLeftButtonDown"
    MouseMove="Viewport3D_MouseMove"
    MouseLeftButtonUp="Viewport3D_MouseLeftButtonUp"
    KeyDown="Viewport3D_KeyDown"
    MouseWheel="Viewport3D_MouseWheel">
    <!-- 3D场景内容 -->
</Viewport3D>

    在代码中处理鼠标滚轮事件:

private void Viewport3D_MouseWheel(object sender, MouseWheelEventArgs e)
{
    double zoomFactor = e.Delta > 0? 1.1 : 0.9;
    ScaleTransform3D scaleTransform = new ScaleTransform3D(zoomFactor, zoomFactor, zoomFactor);
    cubeModel.Transform = new Transform3DGroup()
    {
        Children = 
        {
            cubeModel.Transform,
            scaleTransform
        }
    };
}

六、性能优化与注意事项

6.1 性能优化

    在创建复杂的 3D 场景时,性能问题可能会变得突出。以下是一些优化建议:

  • 减少三角形数量:过多的三角形会增加渲染负担。在创建模型时,尽量使用合理的细分程度,避免不必要的细节。例如,在创建地形模型时,可以根据距离相机的远近动态调整地形的细分程度,远处的地形使用较少的三角形,近处的地形使用较多的三角形以保证细节。
  • 使用纹理映射:相比于使用复杂的几何形状来表现细节,纹理映射可以在不增加过多渲染负担的情况下增加模型的真实感。例如,在创建一个木质箱子模型时,使用一张木质纹理图片进行映射,而不是通过复杂的几何形状来模拟木头的纹理。
  • 视锥体裁剪:只渲染相机视锥体内的物体,对于视锥体外的物体不进行渲染。WPF 在底层已经对视锥体裁剪有一定的支持,但开发者在构建场景时也应注意合理组织物体的位置和大小,避免不必要的渲染开销。

6.2 注意事项

  • 资源管理:3D 场景可能会占用大量的内存和图形资源。在应用程序关闭或切换场景时,要及时释放不再使用的资源,如GeometryModel3D、材质、纹理等,避免内存泄漏。

  • 兼容性问题:不同的显卡和操作系统对 3D 图形的支持可能存在差异。在开发过程中,要进行充分的兼容性测试,确保应用程序在各种环境下都能正常运行。

七、实际应用案例

7.1 工业设计展示

    在工业设计领域,WPF 3D 可以用于创建产品的三维模型展示。例如,汽车制造商可以使用 WPF 3D 创建汽车的 3D 模型,用户可以通过鼠标和键盘交互,从不同角度观察汽车的外观和内部结构,还可以通过动画展示汽车的一些功能,如车门的开关、引擎的启动等,为用户提供更加直观的产品展示体验。

7.2 虚拟现实(VR)和增强现实(AR)

    虽然 WPF 本身并非专门为 VR 和 AR 开发的框架,但结合一些第三方库,它可以在这些领域发挥作用。例如,通过与 OpenVR 等库集成,开发者可以将 WPF 3D 场景显示在 VR 设备上,实现简单的虚拟现实应用。在增强现实方面,WPF 3D 可以用于创建 AR 应用中的 3D 虚拟元素,通过与摄像头采集的图像融合,为用户呈现出增强现实的效果。

八、总结

    通过本文的介绍,我们深入了解了 WPF 3D 图形编程的基础知识,包括 3D 坐标系、模型、材质、变换、3D 场景的创建、基本 3D 物体的构建、动画与交互以及性能优化等方面。WPF 3D 为开发者提供了强大的工具,能够创建出具有丰富视觉效果和交互性的立体用户界面元素。在实际应用中,开发者可以根据具体需求,灵活运用这些知识,打造出令人惊艳的 3D 应用程序。随着技术的不断发展,WPF 3D 也将不断演进,为图形编程领域带来更多的可能性。

结束语

        展望未来,WPF 布局系统依然有着广阔的发展前景。随着硬件技术的不断革新,如高分辨率屏幕、折叠屏设备的日益普及,WPF 布局系统有望进一步强化其自适应能力,为用户带来更加流畅、一致的体验。在应对高分辨率屏幕时,能够更加智能地缩放和布局元素,确保文字清晰可读、图像不失真;对于折叠屏设备,可动态调整布局结构,充分利用多屏空间,实现无缝切换。

        性能优化方面,微软及广大开发者社区将持续努力,进一步降低复杂布局的计算开销,提高布局更新的效率,使得 WPF 应用在处理大规模数据、动态界面时依然能够保持高效响应。通过改进算法、优化内存管理等手段,让 WPF 布局系统在性能上更上一层楼。

        亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

         愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

        至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


--------------- 业精于勤,荒于嬉 ---------------
 

请添加图片描述

--------------- 行成于思,毁于随 ---------------

优质源码分享

  • 【百篇源码模板】html5各行各业官网模板源码下载

  • 【模板源码】html实现酷炫美观的可视化大屏(十种风格示例,附源码)

  • 【VUE系列】VUE3实现个人网站模板源码

  • 【HTML源码】HTML5小游戏源码

  • 【C#实战案例】C# Winform贪吃蛇小游戏源码


在这里插入图片描述


     💞 关注博主 带你实现畅游前后端

     🏰 大屏可视化 带你体验酷炫大屏

     💯 神秘个人简介 带你体验不一样得介绍

     🎀 酷炫邀请函 带你体验高大上得邀请


     ① 🉑提供云服务部署(有自己的阿里云);
     ② 🉑提供前端、后端、应用程序、H5、小程序、公众号等相关业务;
     如🈶合作请联系我,期待您的联系。
    :本文撰写于CSDN平台,作者:xcLeigh所有权归作者所有) ,https://blog.csdn.net/weixin_43151418,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


     亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌


原文地址:https://blog.csdn.net/weixin_43151418/article/details/145469705(防止抄袭,原文地址不可删除)


http://www.kler.cn/a/565805.html

相关文章:

  • Uniapp开发微信小程序插件的一些心得
  • CSS—背景属性与盒子模型(border、padding、margin)
  • ipywidgets深度探索:从交互原理到企业级应用
  • /ɪ/音的字母或字母组合的单词
  • 增强for循环
  • IDEA集成DeepSeek,通过离线安装解决无法安装Proxy AI插件问题
  • 分布式开源协调服务之zookeeper
  • Android实现漂亮的波纹动画
  • 如何在Node.js中处理文件上传?
  • 【Docker】Dify教程(配置文件,附知识库上传15MB限制解决方案)
  • 神经网络AI原理回顾
  • 如何使用Docker搭建哪吒监控面板程序
  • MaxCompute x DataWorks × DeepSeek,实现使用自定义数据集微调DeepSeek-R1蒸馏模型
  • KubeSphere 企业版 v4.1.3 发布!可观测性深度优化,管理策略更灵活更安全
  • PyTorch深度学习框架60天进阶计划第11天:过拟合解决方案深度实践
  • 【六祎 - Note】SQL备忘录;DDL,DML,DQL,DCL
  • 大模型原理与技术(毛玉仁)
  • 头歌实验---C/C++程序设计:实验2:顺序结构程序设计
  • 【Git】版本控制系统Git命令详解
  • 团队协作中的分支合并:构建高效开发流程的关键