Windows 8 Metro 应用开发入门(三):工具栏和对话框

Windows8浅谈之Metro与经典Windows界面 千呼万唤下,Windows 8终于出来了,我想无论是用户还是华尔街的大亨,尤其是像Intel这些都等了太久太久了,再不出来后者就要抓狂了(原因是因为计算机业的生态链)。 在Windows 8出来之后,我勇敢地做了一把小白鼠,先去下载了"带有开发者工具的64位版",接着用Easy 阅读详情


摘 要

Metro UI与Windows Phone一样在提供了布局在屏幕下文的应用程序工具栏BottomAppBar,由于平板设备特有的应用,Metro UI还提供了布局在屏幕上方的导航栏TopAppBar。另外,Metro UI还提供了独特的对话框。这一章我们来介绍一下工具栏与导航栏的应用,最后再介绍一下弹出对话框。

第1节 BottomAppBar

应用程序工具栏BottomAppBar默认是隐藏在屏幕的下方,当用手上屏幕上向上滑动或是在屏幕上点击鼠标右键,BottomAppBar会从下方滑出。BottomAppBar和TopAppBar依托于Page类,如下:

    public class Page
    {
        public AppBar BottomAppBar { get; set; }
        public AppBar TopAppBar { get; set; }
        //...
    }

无论是上方的导航栏还是下方的工具栏,都是AppBar类型,我们来看一下AppBar的定义:

复制代码
    public class AppBar : ContentControl
    {
        public bool IsOpen { get; set; }
        public static DependencyProperty IsOpenProperty { get; }
        public bool IsSticky { get; set; }
        public static DependencyProperty IsStickyProperty { get; }
        public event EventHandler<object> Closed;
        public event EventHandler<object> Opened;
    }
复制代码

IsOpen 指明工具栏是否可见

IsSticky 如果工具栏可见,指明工具栏是否一直可见,即使失去焦点时

Closed 工具栏完全退出后触发事件

Opened 工具栏完全打开后触发事件

AppBar的定义非常简单,如果要使用它,还得自定义其展示视图,不过添加其子元素很方便。使用BottomAppBar有两种方式:XAML和后台Code。

(1)XAML方式

如下XAML我们向Page添加拥有五个按钮的下方工具栏:

复制代码
    <Page.BottomAppBar>
        <AppBar IsSticky="True">
            <Grid>
                <StackPanel Orientation="Horizontal">
                    <Button x:Name="btn1" Style="{StaticResource AppBarButtonStyle}" AutomationProperties.Name="添加"/>
                    <Button x:Name="btn2" Style="{StaticResource EditAppBarButtonStyle}" Click="btn2_Click_1"/>
                    <Button x:Name="btn3" Style="{StaticResource SaveAppBarButtonStyle}" Click="btn3_Click_1"/>
                    <Button x:Name="btn4" Style="{StaticResource DeleteAppBarButtonStyle}"/>
                    <Button x:Name="btn5" Style="{StaticResource DiscardAppBarButtonStyle}"/>
                </StackPanel>
            </Grid>
        </AppBar>
    </Page.BottomAppBar>
复制代码

IsSticky="True"表明当工具栏打开后让它一直显示在屏幕上,在工具栏内先是放置了一个Grid,其内置一个StackPanel,最后是在内部摆放了5个按钮,并且还为按钮btn1设置了名字AutomationProperties.Name="添加",如果要让按钮响应事件,可以为每个按钮注册事件处理程序,就像btn2和btn3一样注册了Click事件。在创建Metro应用程序项目的时候,在Common文件夹下有一个默认的样式StandardStyles.xaml,里面有一系列的工具栏按钮样式,但是被注释掉的,我们可以取消注释,然后在我们的程序中使用它们,大概在StandardStyles.xaml文档的249行开始,有一个基本样式AppBarButtonStyle,其他的如EditAppBarButtonStyle和SaveAppBarButtonStyle等都是基于AppBarButtonStyle进行实现的,上面XAML中用到了AppBarButtonStyle、EditAppBarButtonStyle、SaveAppBarButtonStyle、DeleteAppBarButtonStyle等,我们来看一下上面XAML最终展示的效果:

(2)Code方式使用AppBar

代码创建工具栏只需要实例化AppBar且向其添加子元素即可,最后将AppBar实例给当前页的上/下方工具栏,如下代码:

复制代码
        private void CreateAppBar()
        {
            AppBar bottomBar = new AppBar();
            StackPanel sp = new StackPanel() { Orientation = Orientation.Horizontal };

            Button btn1 = new Button();
            btn1.Style = (Style)App.Current.Resources["AddAppBarButtonStyle"];
            sp.Children.Add(btn1);
            Button btn2 = new Button();
            btn2.Style = (Style)App.Current.Resources["EditAppBarButtonStyle"];
            sp.Children.Add(btn2);

            bottomBar.Content = sp;
            this.BottomAppBar = bottomBar;
        }
复制代码

 

第2节 TopAppBar

TopAppBar与BottomAppBar使用方法相同,无非就是名字不一样,而对于Page来说,TopAppBar在上方,更多的时候称为导航栏,BottomAppBar在下方,称为应用程序工具栏。在这里我们只展示如何用XAML创建一个导航栏TopAppBar:

复制代码
    <Page.TopAppBar>
        <AppBar>
            <Grid>
                <StackPanel Orientation="Horizontal">
                    <Button x:Name="btnTop1" Style="{StaticResource AddAppBarButtonStyle}" AutomationProperties.Name="添加s"/>
                    <Button x:Name="btnTop2" Style="{StaticResource EditAppBarButtonStyle}"/>
                    <Button x:Name="btnTop3" Style="{StaticResource SaveAppBarButtonStyle}"/>
                    <Button x:Name="btnTop4" Style="{StaticResource DeleteAppBarButtonStyle}"/>
                    <Button x:Name="btnTop5" Style="{StaticResource DiscardAppBarButtonStyle}"/>
                </StackPanel>
            </Grid>
        </AppBar>
    </Page.TopAppBar>
复制代码

只要注意一点即可,那就是以Page.TopAppBar指明该AppBar为上方的导航栏,其他与BottomAppBar完全一样,效果如下:

这一次我们既指定了按钮的Content,又指定了其文字下标。

 

第3节 自定义AppBar

以上我们讨论的都是使用Metro应用程序项目默认的模板样式,如果你觉得上面的样式太单调,当然可以自定义按钮样式,比如使用图标,甚至你可以使用动画效果,接下来我们看看如何自定义样式。

在前面的讨论中我们知道AppBar是一个容器控件,并且只能包含一个子元素,所以我们在AppBar内放置一个Grid作为布局父控件,然后再将相应的按钮元素分配到Grid的各个单元格中。如下我们定义了一个背景具有渐变效果的Grid,且放置了三个按钮的下方应用程序工具栏,如图:

这一次我们并没有使用StandardStyles.xaml中的样式,只是简单为按钮放置了一个图标,XAML部分:

复制代码
<Page.BottomAppBar>
        <AppBar IsSticky="True">
            <Grid Margin="0" >
                <Grid.Background>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#B24FF53E"/>
                        <GradientStop Color="#B2F9F6F3" Offset="0.6"/>
                        <GradientStop Color="#B2FB8421" Offset="1"/>
                    </LinearGradientBrush>
                </Grid.Background>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="100"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Button x:Name="btn1" Grid.Column="0">
                    <Image Source="Assets/user.png"/>
                </Button>
                <Button x:Name="btn2" Grid.Column="1">
                    <Image Source="Assets/Cycle Racer.png"/>
                </Button>
                <Button x:Name="btn3" Grid.Column="2">
                    <Image Source="Assets/Add to Cart.png"/>
                </Button>
            </Grid>
        </AppBar>
    </Page.BottomAppBar>
复制代码

这里当然也可以使用StackPanel等其他布局控件,你完全可以按照你自己的要求设计出各种各样的Metro UI 风格的工具栏。

 

第4节 使用工具栏的事件

使用工具栏的目的就是要触发一定的动作,所以要想让工具栏里的按钮响应事件,则必须要为每个按钮注册事件处理程序。比如第1节示例中的btn2和btn3:

<Button x:Name="btn2" Style="{StaticResource EditAppBarButtonStyle}" Click="btn2_Click_1"/>
<Button x:Name="btn3" Style="{StaticResource SaveAppBarButtonStyle}" Click="btn3_Click_1"/>

当为按钮注册Click事件后,在后台的事件处理程序中就可以执行相应的操作,如下:

复制代码
        private void btn2_Click_1(object sender, RoutedEventArgs e)
        {
            //Do Something
        }

        private void btn3_Click_1(object sender, RoutedEventArgs e)
        {
            //Do Something
        }
复制代码

我们知道Silverlight是基于异步编程模型,同样在Metro App中也是基于异步编程模型,所以对于有耗时计算的,建议在工具栏的按钮处理程序中使用异步编程,这样不影响UI的流畅度,也是微软一直鼓励的做法。当然,在必要的时候或者是你喜欢的时候,也可以使用async/await来实现异步编程的不一样体验,尽管在.NET Framework4.5中增强了对异步的实现,但还是建议使用异步处理。在大家都很忙且有点急促的今天,给用户一个“不用等待”的体现,有什么不好呢?

其实关于应用程序工具栏和导航栏的使用,微软还是建议不要在主视图中使用太多的按钮,尽量把命令按钮放在工具栏中,为MetroUI提供一致的用户体验。

 

第5节 弹出对话框

以往的开发中我们常常会弹出一个模态对话框来等待用户的响应,silverlight中是使用MessageBox,但在Metro UI中提供了一个全新的对话框MessageDialog,它是以异步方式弹出,你当然可以使用await来等待用户的响应,它还有一个更炫耀的功能就是可以在一个对话框让指定多个命令!你在以往往的开发中如果想实现类似的功能,是不是得自己实现?MessageDialog只提供了一个弹出方法:

public IAsyncOperation<IUICommand> ShowAsync();

(1)只有提示消息对话框

使用一个构造函数的MessageDialog可以实例化一个对话框,然后以异步方式打开它,此时它会默认显示一个“关闭”按钮:

          MessageDialog md = new MessageDialog("保存成功,请注意查收。");
            md.ShowAsync();

效果图:

(2)带有标题的对话框

            MessageDialog md = new MessageDialog("保存成功,请注意查收。", "提示");

效果图:

(3)指定自定义命令的对话框

MessageDialog类有一个重要的成员,可以在当前对话框中呈现多个命令按钮:

public IList<IUICommand> Commands { get; }   

可以看到,只要你愿意,你可以向Commands注入多个命令,有意思吧?有一个已经实现了接口IUICommand的类UICommand,这个类就是对命令的处理,它不仅接收一个标签文本,还可以接收一个处理程序的委托UICommandInvokedHandler,UICommand类的构造函数有四个:

        public UICommand();
        public UICommand(string label);
        public UICommand(string label, UICommandInvokedHandler action);
        public UICommand(string label, UICommandInvokedHandler action, object commandId);

来看一下如何注册命令的处理程序:

复制代码
        MessageDialog md = new MessageDialog("确定要提交当前数据吗?", "询问");
            md.Commands.Add(new UICommand("确定", cmd =>
            {
                Debug.WriteLine("确定");
            }));
            md.Commands.Add(new UICommand("放弃", cmd => 
            {
                Debug.WriteLine("放弃");
            }));
            md.ShowAsync();
复制代码

效果图:

如果你觉得上面的处理还不过瘾,请看下面。

(4)使用具有命令Id的命令

细心的你一定能发现上面UICommand的最后一个构造函数:

public UICommand(string label, UICommandInvokedHandler action, object commandId);

最后一个参数可以指定命令的Id,也就是说,在下文中我们可以根据这个Id来进行不同的操作,这个object类型的Id允许你给它任意类型的数据。下面的代码我们取消了注册命令处理程序,而是为指定了命令Id:

复制代码
                        MessageDialog md = new MessageDialog("确定要提交当前数据吗?", "询问");
            md.Commands.Add(new UICommand("确定", null, 0));
            md.Commands.Add(new UICommand("放弃", null, 1));
            md.Commands.Add(new UICommand("帮组", null, 2));
            md.DefaultCommandIndex = 0;
            md.CancelCommandIndex = 1;
            var flg = await md.ShowAsync();
            //var flg = md.ShowAsync();
            switch (flg.Id)
            {
                case 0:
                    //Do Something
                    break;
                case 1:
                    //Do Something
                    break;
                case 2:
                    //Go to Help
                    break;
                default:
                    break;
            }
复制代码

效果图:

在前面我们看到MessageDialog是以异步方式打开,所以我们可以根据需要获取ShowAsync()的响应结果,根据命令Id执行进一步的操作。使用DefaultCommandIndex指定当我们按下Enter键时响应的按钮,CancelCommandIndex指定当按下Esc键时应的按钮。

很遗憾的是MessageDialoge不能定义对话框的样式, 如何想创建更个性的对话框,可以使用Popup 来模拟对话框,关于Popup这里就不再介绍了,感兴趣的可以去查找相关资料。

 

小 结
本博客文章版权归博客园和solan3000共同所有。

Windows 8 Metro应用开发核心原理与现代工程思维 Metro应用是Windows平台从桌面范式迈向现代应用架构的关键转折点,其本质是一套以生命周期管理、能力声明机制和沙箱化运行为特征的系统级契约。它强制采用异步编程模型(async/await)、状态持久化(Suspend/Resume)、权限沙箱(Capabilities)和动态UI(Live Tile),深刻影响了UWP、Flutter乃至Electron等后续框架的设计逻辑。理解Metro不仅关乎历史技术复盘,更是掌握资源调度、后台任务约束、响应式布局与安全模型等通用移动/跨平台开发底层原理的高效入口 阅读详情

相关推荐

Windows 8 Metro风格鼠标指针设计详解

Windows 8操作系统重塑了个人电脑的交互界面,其中,Metro界面作为其核心组件,为用户提供了一种全新的操作体验。本章将带您深入了解Metro界面的起源、设计理念及其与用户的交互方式。为了更好地满足不同用户的个性化需求,鼠标指针Metro X提供了用户自定义选项,允许用户根据个人喜好设置指针的颜色、大小和动画效果等。用户可以通过内置的设置面板,轻松更改指针的外观和行为,这样的自定义选项大大增强了产品的可接受度和用户满意度。

weixin_42181686的博客 1072

一个Metro风格的窗口边框处理库

MetroWindow是一个专门处理Win32窗口边框的C++库,这个库的目的只有一个,就是提供一个具有流行视觉的Win32窗口。 特性: 为使用者处理了自定义边框可能遇到的各种问题,保持和原生窗口一样的键盘、鼠标事件处理行为。 提供了最佳的绘制性能,针对Windows XP和高版本的Windows做了不同的处理。 只是用了Win32 API,不依赖MFC等其他库。 支持模态、非模态对话框,支持...

Avlee's Blog 1900

WPF做Metro界面

这是一个用C# WPF完成的一个类似windows8中的Metro界面,界面中的图标可以点击并执行相关windows操作,很有参考价值!

WPF使用 MahApps.Metro,如何更改MetroWindow标题的字体?

WPF使用 MahApps.Metro,如何更改MetroWindow标题的字体?

^@^lemon tea^@^ 1456

Python爬虫实战:用Selenium+ChromeDriver批量抓取政府网站政策文件(附完整代码)

本文详细介绍了使用Python的Selenium和ChromeDriver进行政府网站政策文件批量抓取的实战技巧。从环境配置、动态页面元素定位到分页机制破解和反爬虫策略,提供了完整的解决方案和代码示例,帮助开发者高效获取结构化政策数据。

weixin_42531710的博客 266

BitLocker加密盘解密实战:从隐藏分区到密钥恢复的全过程

本文深入探讨了BitLocker加密盘在密钥丢失或遗忘情况下的解密实战方法。文章系统性地介绍了从理解加密机制、制作取证镜像,到深度扫描隐藏分区、分析内存转储寻找密钥残留,最终利用恢复密钥解锁加密卷的全过程。重点剖析了非标准恢复路径,为数据恢复和数字取证工作提供了专业的技术框架和实战思路。

weixin_29268385的博客 334

MahApps.Metro之MetroWindow

文档目录1、窗口普通边框2、窗口发光边框3、窗口投影边框 1、窗口普通边框 <Controls:MetroWindow x:Class="MahApps.Metro.Simple.Demo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ...

LADT的博客 4032

Palabos 并行计算与多物理场模拟实战指南

本文详细介绍了Palabos在并行计算与多物理场模拟中的实战应用。作为基于C++和LBM的开源CFD工具,Palabos通过MPI实现高效并行计算,特别适合处理复杂流体模拟问题。文章涵盖从基础安装、多物理场耦合技巧到性能优化策略,并分享工业级应用案例与调试经验,帮助开发者快速掌握这一强大工具。

4k5l6j7h8的博客 245

告别Windows传统界面:MetroWindow如何重塑WPF应用视觉体验

你是否还在为WPF应用的原生窗口样式单调、定制困难而烦恼?是否尝试过修改窗口标题栏却陷入系统API调用的泥潭?MahApps.Metro框架的MetroWindow控件通过1500+行代码实现了对Windows窗口的彻底改造,让开发者无需复杂的Win32编程就能创建符合现代设计美学的应用界面。本文将从架构设计到实际应用,拆解MetroWindow的实现原理与核心功能。 ## 从传统窗口到Metr...

gitblog_01085的博客 1297

MaxEnt软件的下载与安装

1、下载网站:http://lucky-boy.ys168.com/ (这是之前在网上搜到的,里面有许多软件安装包,感谢网页主的资源共享,违权必删)

weixin_42191203的博客 2万+

STM32F103C8T6 + GY-906红外测温:手把手教你用CubeMX和HAL库搞定IIC驱动(附完整工程)

本文详细介绍了如何使用STM32F103C8T6和GY-906红外测温传感器(基于MLX90614芯片)实现非接触式温度测量。从STM32CubeMX工程创建、HAL库驱动适配到温度数据采集与处理,提供完整的开发流程和常见问题解决方案,帮助开发者快速掌握红外测温技术。

weixin_29188043的博客 254

(二)Mahapps标题栏

一.MetroWindow 是什么? 1.默认的MetroWindow由以下几部分组成: (1)标题栏的显示/不显示: ShowTitleBar="False" (2)调节柄并不是调节窗口的唯一方式,通过所有的边角都可以调整,但是如果不给一个明显的调节柄标志,就无法让用户安心使用。 (3)标题栏图标的显示/不显示 ShowIconOnTitleBar="F...

dianheping7931的博客 1020

GEE土地分类:一文读懂精度评定—混淆矩阵confusion matrix、整体精度OA、用户者精度、生产者精度、kappa系数和F1score系数含案例

本文介绍了如何在 Google Earth Engine (GEE) 中构建和分析混淆矩阵,以评估分类模型的性能。首先,通过 ee.Array 构建混淆矩阵,并展示了如何指定自定义类标签。接着,计算了多种性能指标,包括准确率、Kappa 值、F1-score、消费者准确率和生产者准确率。此外,还演示了如何计算不同类别的 F1-score。最后,通过一个实际案例,展示了如何利用 GEE 进行土地分类,并评估分类器的性能,包括训练和验证样本的准确率、Kappa 值等指标。这些步骤帮助用户理解模型的优缺点,并进行

此星光明博客 443

metro样式开机启动菜单_如何在Windows 8中获取Metro风格的开始菜单和开始按钮

metro样式开机启动菜单Windows 8 has a new Start Screen, but there’s no Start Button anymore–and that might be too much for some people to deal with. Here’s how to get a Start button that opens up the new Metro...

1976

《QGIS快速入门与应用基础》151:批量属性值赋值(字段计算器)

本文介绍了QGIS中字段计算器的批量属性值赋值方法,重点讲解了简单赋值(统一值和递增序列)的操作步骤与表达式应用。文章首先强调数据备份、字段类型确认等必要前提,随后详细解析字段计算器的界面功能分区和打开方式。通过具体场景示例,展示了如何为图层统一赋值固定值或生成连续编号序列,并提供了文本、数字、日期等不同字段类型的表达式模板。文中特别提醒新手优先创建新字段而非直接更新现有字段,以避免数据丢失风险,同时推荐使用$id和rownum()函数实现基础序列生成。该教程适合GIS初学者快速掌握批量属性编辑的核心技能。

LuckyHanMo的博客 489

RD算法(一)初出茅庐 —— 算法原理

在《SAR成像概述》的第4节已经对各种SAR成像算法进行了一个简要的概述,本文就直接从RD算法讲起了。

5288

超棒的 Windows 8 Metro UI 风格框架

这些资源包含:模板,框架,jQuery插件,图标集等。帮助你快速开发Windows 8 Metro UI风格的网站。 Frameworks & Templates For Metro-Styled Websites Metro UI CSS Metro UI CSS是一个漂亮,完整的框架,用于构建Metro风格网站。 它有杉LESS创建并拥有一个网格系统,包含排

每天进步一点点 6697

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Windows 8 Metro 应用开发入门(一):开发环境介绍

原帖地址:http://www.cnblogs.com/solan/tag/Metro/ 摘 要 Windows8已经发布,随之而来的基于WinRT的Metro应用也正向我们走来,正像它所宣传的:光滑、快、现代。看习惯了玻璃、立体风格的应用,或许Metro的简洁能给你留下不一样的体验。Visual Studio 2012为Metro应用提供了强有力的开发支持。磨刀不误砍柴工!这一章我们

fighter_yy的专栏 1039

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

使用metro引导加载程序_如何在Windows 8中从Metro应用程序打印

使用metro引导加载程序() Printing has become an application aware feature in Metro applications. This makes the outcome of a print job different from application to application, but the question remains, how d...

culiuman3228的博客 267

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Windows 8 Build 7777技术解析:从版本号系统到早期Metro UI实现

操作系统版本号是软件开发过程中的重要标识符,它通过特定的编号规则记录代码库的编译状态和功能演进。在Windows系统开发中,Build版本号不仅代表技术里程碑,更体现了微软对存储优化、网络架构和安全机制的持续改进。以Windows 8 Build 7777为例,这个特殊版本展示了早期Metro UI(后称Modern UI)的设计理念,同时集成了Storage Spaces存储池功能和改进的Windows Defender安全组件。这些技术特性为后续Windows 8.1和Windows 10的统一平台架构

weixin_34122604的博客 403

windows 8 metro MessageBox消息框的消失

windows 8 metro 已经不存在 MessageBox 了 那么我们怎么实现这一的效果和获取到消息框的值那?   private async void Button_Click_1(object sender, RoutedEventArgs e)         {             MessageDialog msg = new MessageDialog("确定要退出

西门大总管 2031

推荐微软Windows 8 Metro应用开发虚拟实验室

微软官方将在2012年10月26日发布Windows 8正式版,为了帮助更多开发人员快速学习掌握Windows 8 Metro应用开发,微软MSDN推出“Windows 8 Release Preview Metro应用开发虚拟实验室”(MSDN Virtual Lab:Windows 8)。该虚拟实验室为开发人员提供Windows 8 Release Preview操作系统虚拟机,以及开发工

Kevin Fan 1393

metro桌面 安卓_如何在Windows 8中引导至桌面和跳过Metro

metro桌面 安卓Windows 8 always shows the Metro-style Start screen when you log in. You don’t have to click the Desktop tile every time you log in, you can boot straight to the desktop with this quick tric...

cum88284的博客 379

Windows8 Metro快捷键大全

导读:习惯用快捷键能大大的提高效率是大家都知道的事实,随着微软每次发布操作系统都会根据新功能增加一些快捷键。这里重点介绍 Windows 8 Metro 界面操作的快捷键,之前发布过《Windows8哪里关机?》,其实按Win+I就能弹出 Settings界面 里面就有关机按钮。所以你一定要记住Windows8 Metro快捷键,能让你节省很多的时间。   windows8 Metro快

xpxtnet的专栏 635
上一篇: Windows 8 Metro 应用开发入门(二):Metro App的几个新控件
下一篇: Expression Blend实例中文教程系列文章汇总
fighter_yy
博客等级 码龄20年 22粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值