在 .NET MAUI 中如何更好地自定义控件

点击上方蓝字

关注我们

(本文阅读时间:10分钟)

今天,我想谈谈并向您展示在.NET MAUI中完全自定义控件的方法。在查看 .NET MAUI 之前,让我们回到几年前,回到 Xamarin.Forms 时代。那时,我们有很多自定义控件的方法, 比如当您不需要访问平台特有的 API 来自定义控件时,可以使用Behaviors ; 如果您需要访问平台特有的 API,可以使用 Effects。

让我们稍微关注一下Effects API。它是由于 Xamarin 缺乏多目标体系结构而创建的。这意味着我们无法在共享级别(在 .NET 标准 csproj 中)访问特定于平台的代码。它工作得很好,可以让您免于创建自定义渲染器。

今天,在 .NET MAUI 中,我们可以利用多目标架构的强大功能,并在我们的共享项目中访问特定于平台的 API。那么我们还需要 Effects 吗?不需要了,因为我们可以访问我们所需要的所有平台的所有代码和 API。

那么让我们谈谈在 .NET MAUI 中自定义一个控件的所有可能性以及在此过程中您可以遇到的一些障碍。为此,我们将自定义 Image 控件,添加对呈现的图像进行着色的功能。

注意:如果您想使用 Effects ,.NET MAUI仍然支持,但不建议使用

源代码参考来自 .NET MAUI Community Toolkit 的IconTintColor。

  • .NET MAUI:

    https://dotnet.microsoft.com/zh-cn/apps/maui?ocid=AID3052907

  • Xamarin.Forms:

    https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/?WT.mc_id=dotnet-0000-bramin?ocid=AID3052907

  • Behaviors:

    https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/app-fundamentals/behaviors/?WT.mc_id=dotnet-0000-bramin?ocid=AID3052907

  • Effects:

    https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/app-fundamentals/effects/introduction?WT.mc_id=dotnet-0000-bramin?ocid=AID3052907

  • 自定义渲染器:

    https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/app-fundamentals/custom-renderer/?WT.mc_id=dotnet-0000-bramin?ocid=AID3052907

  • IconTintColor:

    https://github.com/CommunityToolkit/Maui/tree/main/src/CommunityToolkit.Maui/Behaviors/PlatformBehaviors/IconTintColor

8322a8da2ea7cdce015911a7e9105d9e.png

自定义现有控件 

090094abc28d61280f5f3404d26836bf.png

要向现有控件添加额外的功能,需要我们对其进行扩展并添加所需的功能。

让我们创建一个新控件,class ImageTintColor : Image 并添加一个新的 BindableProperty,我们将利用它来更改 Image 的色调颜色。

public class ImageTintColor : Image
{public static readonly BindableProperty TintColorProperty =BindableProperty.Create(nameof(TintColor), typeof(Color), typeof(ImageTintColor), propertyChanged: OnTintColorChanged);public Color? TintColor{get => (Color?)GetValue(TintColorProperty);set => SetValue(TintColorProperty, value);}static void OnTintColorChanged(BindableObject bindable, object oldValue, object newValue){// ...}
}

熟悉 Xamarin.Forms 的人会认识到这一点;它与您将在 Xamarin.Forms 应用程序中编写的代码几乎相同。

.NET MAUI 平台特定的 API 工作将在 OnTintColorChanged 委托上进行。让我们来看看。

public class ImageTintColor : Image
{public static readonly BindableProperty TintColorProperty =BindableProperty.Create(nameof(TintColor), typeof(Color), typeof(ImageTintColor), propertyChanged: OnTintColorChanged);public Color? TintColor{get => (Color?)GetValue(TintColorProperty);set => SetValue(TintColorProperty, value);}static void OnTintColorChanged(BindableObject bindable, object oldValue, object newValue){var control = (ImageTintColor)bindable;var tintColor = control.TintColor;if (control.Handler is null || control.Handler.PlatformView is null){// 执行 Handler 且 PlatformView 为 null 时的解决方法control.HandlerChanged += OnHandlerChanged;return;}if (tintColor is not null){
#if ANDROID// 注意 Android.Widget.ImageView 的使用,它是一个 Android 特定的 API// 您可以在这里找到`ApplyColor`的Android实现:https://github.com/pictos/MFCC/blob/1ef490e507385e050b0cfb6e4f5d68f0cb0b2f60/MFCC/TintColorExtension.android.cs#L9-L12ImageExtensions.ApplyColor((Android.Widget.ImageView)control.Handler.PlatformView, tintColor);
#elif IOS// 注意 UIKit.UIImage 的使用,它是一个 iOS 特定的 API// 您可以在这里找到`ApplyColor`的iOS实现:https://github.com/pictos/MFCC/blob/1ef490e507385e050b0cfb6e4f5d68f0cb0b2f60/MFCC/TintColorExtension.ios.cs#L7-L11ImageExtensions.ApplyColor((UIKit.UIImageView)control.Handler.PlatformView, tintColor);
#endif}else{
#if ANDROID// 注意 Android.Widget.ImageView 的使用,它是一个 Android 特定的 API// 您可以在这里找到 `ClearColor` 的 Android 实现:https://github.com/pictos/MFCC/blob/1ef490e507385e050b0cfb6e4f5d68f0cb0b2f60/MFCC/TintColorExtension.android.cs#L14-L17ImageExtensions.ClearColor((Android.Widget.ImageView)control.Handler.PlatformView);
#elif IOS// 注意 UIKit.UIImage 的使用,它是一个 iOS 特定的 API// 您可以在这里找到`ClearColor`的iOS实现:https://github.com/pictos/MFCC/blob/1ef490e507385e050b0cfb6e4f5d68f0cb0b2f60/MFCC/TintColorExtension.ios.cs#L13-L16ImageExtensions.ClearColor((UIKit.UIImageView)control.Handler.PlatformView);
#endif}void OnHandlerChanged(object s, EventArgs e){OnTintColorChanged(control, oldValue, newValue);control.HandlerChanged -= OnHandlerChanged;}}
}

因为 .NET MAUI 使用多目标,我们可以访问平台的详细信息并按照我们想要的方式自定义控件。ImageExtensions.ApplyColor 和 ImageExtensions.ClearColor 方法是添加或删除图像色调的辅助方法。

您可能会注意到 Handler 和 PlatformView 的 null 检查。这可能是您在使用过程中遇到的第一个阻碍。在创建和实例化 Image 控件并调用 BindableProperty 的 PropertyChanged 委托时,Handler 可以为 null。因此,如果不进行 null 检查,代码将抛出 NullReferenceException。这听起来像一个bug,但它实际上是一个特性!这使 .NET MAUI 工程团队能够保持与 Xamarin.Forms 上的控件相同的生命周期,从而避免从 Forms 迁移到 .NET MAUI 的应用程序的一些重大更改。

现在我们已经完成了所有设置,可以在 ContentPage 中使用控件了。在下面的代码片段中,您可以看到如何在 XAML 中使用它:

<ContentPage x:Class="MyMauiApp.ImageControl"xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:local="clr-namespace:MyMauiApp"Title="ImageControl"BackgroundColor="White"><local:ImageTintColor x:Name="ImageTintColorControl"Source="shield.png"TintColor="Orange" />
</ContentPage>

3d86cd6ec62502a53631e20addb55b48.png

使用附加属性和 PropertyMapper 

1182d78d5d3efa08cd155587bfdb8fd3.png

自定义控件的另一种方法是使用 AttachedProperties,当您不需要将其绑定到特定的自定义控件时是 使用BindableProperty。

下面是我们如何为 TintColor 创建一个 AttachedProperty:

public static class TintColorMapper
{public static readonly BindableProperty TintColorProperty = BindableProperty.CreateAttached("TintColor", typeof(Color), typeof(Image), null);public static Color GetTintColor(BindableObject view) => (Color)view.GetValue(TintColorProperty);public static void SetTintColor(BindableObject view, Color? value) => view.SetValue(TintColorProperty, value);public static void ApplyTintColor(){// ...}
}

同样,我们在 Xamarin.Forms 上为 AttachedProperty 提供了样板,但如您所见,我们没有 PropertyChanged 委托。为了处理属性更改,我们将使用 ImageHandler 中的 Mapper。您可以在任何级别添加 Mapper,因为成员是静态的。我选择在 TintColorMapper 类中执行此操作,如下所示。

public static class TintColorMapper
{public static readonly BindableProperty TintColorProperty = BindableProperty.CreateAttached("TintColor", typeof(Color), typeof(Image), null);public static Color GetTintColor(BindableObject view) => (Color)view.GetValue(TintColorProperty);public static void SetTintColor(BindableObject view, Color? value) => view.SetValue(TintColorProperty, value);public static void ApplyTintColor(){ImageHandler.Mapper.Add("TintColor", (handler, view) =>{var tintColor = GetTintColor((Image)handler.VirtualView);if (tintColor is not null){
#if ANDROID// 注意 Android.Widget.ImageView 的使用,它是一个 Android 特定的 API// 您可以在这里找到`ApplyColor`的Android实现:https://github.com/pictos/MFCC/blob/1ef490e507385e050b0cfb6e4f5d68f0cb0b2f60/MFCC/TintColorExtension.android.cs#L9-L12ImageExtensions.ApplyColor((Android.Widget.ImageView)control.Handler.PlatformView, tintColor);
#elif IOS// 注意 UIKit.UIImage 的使用,它是一个 iOS 特定的 API// 您可以在这里找到`ApplyColor`的iOS实现:https://github.com/pictos/MFCC/blob/1ef490e507385e050b0cfb6e4f5d68f0cb0b2f60/MFCC/TintColorExtension.ios.cs#L7-L11ImageExtensions.ApplyColor((UIKit.UIImageView)handler.PlatformView, tintColor);
#endif}else{
#if ANDROID// 注意 Android.Widget.ImageView 的使用,它是一个 Android 特定的 API// 您可以在这里找到 `ClearColor` 的 Android 实现:https://github.com/pictos/MFCC/blob/1ef490e507385e050b0cfb6e4f5d68f0cb0b2f60/MFCC/TintColorExtension.android.cs#L14-L17ImageExtensions.ClearColor((Android.Widget.ImageView)handler.PlatformView);
#elif IOS// 注意 UIKit.UIImage 的使用,它是一个 iOS 特定的 API// 您可以在这里找到`ClearColor`的iOS实现:https://github.com/pictos/MFCC/blob/1ef490e507385e050b0cfb6e4f5d68f0cb0b2f60/MFCC/TintColorExtension.ios.cs#L13-L16ImageExtensions.ClearColor((UIKit.UIImageView)handler.PlatformView);
#endif}});}
}

代码与之前显示的几乎相同,只是使用了另一个 API 实现,在本例中是 AppendToMapping 方法。如果您不想要这种行为,可以改用 CommandMapper,它将在属性更改或操作发生时触发。

请注意,当我们处理 Mapper 和 CommandMapper 时,我们将为项目中使用该处理程序的所有控件添加此行为。在这种情况下,所有Image控件都会触发此代码。在某些情况下这可能并不是您想要的,如果您需要更具体的方法, PlatformBehavior 方法将会非常适合。

现在我们已经设置好了所有内容,可以在页面中使用控件了,在下面的代码片段中,您可以看到如何在 XAML 中使用它。

<ContentPage x:Class="MyMauiApp.ImageControl"xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:local="clr-namespace:MyMauiApp"Title="ImageControl"BackgroundColor="White"><Image x:Name="Image"local:TintColorMapper.TintColor="Fuchsia"Source="shield.png" />
</ContentPage>

b0e68413ff0d6914c950018a60ad90c0.png

使用PlatformBehavior

0a30578feb4b9ac48222c8a15efea18e.png

PlatformBehavior 是在 .NET MAUI 上创建的新 API,它让您在需要以安全的方式访问平台特有的 API 时,可以更轻松地自定义控件(这是安全的因为它确保 Handler 和 PlatformView 不为 null )。它有两种方法来重写:OnAttachedTo 和 OnDetachedFrom。此 API 用于替换 Xamarin.Forms 中的 Effect API 并利用多目标体系结构。

在此示例中,我们将使用部分类来实现特定于平台的 API:

//文件名 : ImageTintColorBehavior.cspublic partial class IconTintColorBehavior 
{public static readonly BindableProperty TintColorProperty =BindableProperty.Create(nameof(TintColor), typeof(Color), typeof(IconTintColorBehavior), propertyChanged: OnTintColorChanged);public Color? TintColor{get => (Color?)GetValue(TintColorProperty);set => SetValue(TintColorProperty, value);}
}

上面的代码将被我们所针对的所有平台编译。

现在让我们看看 Android 平台的代码:

//文件名: ImageTintColorBehavior.android.cspublic partial class IconTintColorBehavior : PlatformBehavior<Image, ImageView> 
// 注意 ImageView 的使用,它是 Android 特定的 API{protected override void OnAttachedTo(Image bindable, ImageView platformView) =>ImageExtensions.ApplyColor(bindable, platformView); 
// 您可以在这里找到`ApplyColor`的Android实现:https://github.com/pictos/MFCC/blob/1ef490e507385e050b0cfb6e4f5d68f0cb0b2f60/MFCC/TintColorExtension.android.cs#L9-L12protected override void OnDetachedFrom(Image bindable, ImageView platformView) =>ImageExtensions.ClearColor(platformView); 
// 您可以在这里找到 `ClearColor` 的 Android 实现:https://github.com/pictos/MFCC/blob/1ef490e507385e050b0cfb6e4f5d68f0cb0b2f60/MFCC/TintColorExtension.android.cs#L14-L17
}

这是 iOS 平台的代码:

//文件名: ImageTintColorBehavior.ios.cspublic partial class IconTintColorBehavior : PlatformBehavior<Image, UIImageView> 
// 注意 UIImageView 的使用,它是一个 iOS 特定的 API
{protected override void OnAttachedTo(Image bindable, UIImageView platformView) => ImageExtensions.ApplyColor(bindable, platformView); 
// 你可以在这里找到`ApplyColor`的iOS实现:https://github.com/pictos/MFCC/blob/1ef490e507385e050b0cfb6e4f5d68f0cb0b2f60/MFCC/TintColorExtension.ios.cs#L7-L11protected override void OnDetachedFrom(Image bindable, UIImageView platformView) => ImageExtensions.ClearColor(platformView); 
// 你可以在这里找到`ClearColor`的iOS实现:https://github.com/pictos/MFCC/blob/1ef490e507385e050b0cfb6e4f5d68f0cb0b2f60/MFCC/TintColorExtension.ios.cs#L13-L16
}

正如您所看到的,我们不需要关心是否 Handler 为 null ,因为 PlatformBehavior<T, U> 会为我们处理。

我们可以指定此行为涵盖的平台特有的 API 的类型。如果您想为多个类型应用控件,则无需指定平台视图的类型(例如,使用 PlatformBehavior<T> );您可能想在多个控件中应用您的行为,在这种情况下,platformView 将是 Android 上的 PlatformBehavior<View> 和 iOS 上的 PlatformBehavior<UIView>。

而且用法更好,您只需要调用 Behavior 即可:

<ContentPage x:Class="MyMauiApp.ImageControl"xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:local="clr-namespace:MyMauiApp"Title="ImageControl"BackgroundColor="White"><Image x:Name="Image"Source="shield.png"><Image.Behaviors><local:IconTintColorBehavior TintColor="Fuchsia"></Image.Behaviors></Image>
</ContentPage>

注意:当 Handler 与 VirtualView 断开连接时,即触发 Unloaded 事件时,PlatformBehavior 将调用 OnDetachedFrom。Behavior API 不会自动调用 OnDetachedFrom 方法,作为开发者需要自己处理。

4ea1d776ea876a98d16c6b100dc0dd29.png

总结

423fad8a965839bf5b87b91a6dbf1142.png

在这篇文章中,我们讨论了自定义控件以及与平台特有的 API 交互的各种方式。没有正确或错误的方法,所有这些都是有效的解决方案,您只需要看看哪种方法更适合您的情况。我想说的是,在大多数情况下,您会想要使用 PlatformBehavior,因为它旨在使用多目标方法并确保在控件不再使用时清理资源。要了解更多信息,请查看有关自定义控件的文档。

  • 有关自定义控件的文档:

    https://docs.microsoft.com/zh-cn/dotnet/maui/user-interface/handlers/customize?ocid=AID3052907

  • 有关更多的MAUI workshop,请查看:

    https://github.com/dotnet-presentations/dotnet-maui-workshop/blob/main/README.zh-cn.md

ef44044f3f79ede0a415f06dbf5ddf5a.png

谢谢你读完了本文~相信你一定有一些感想、观点、问题想要表达。欢迎在评论区畅所欲言,期待听到你的“声音”哦!

同时,喜欢的内容也不要忘记转发给你的小伙伴们,谢谢你的支持!

65b13b4e2006383c848d17336c6f36c1.jpeg

长按识别二维码

关注微软中国MSDN

2c6b733f2510ad16a37e00ac95cdb4d2.gif

点击「阅读原文」了解更多~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GlobalMapper精品教程】036:基于DEM的流域计算生成流域图

Globalmapper基于DEM的流域计算生成流域图教程。 文章目录一、加载DEM二、流域分析一、加载DEM 加载配套实验数据。 二、流域分析 GM中的流域分析工具位于分析→生成流域&#xff0c;如下所示&#xff1a; 参数设置如下&#xff1a; 流域计算结果&#xff1a;

html之file标签 --- 图片上传前预览 -- FileReader

记得以前做网站时&#xff0c;曾经需要实现一个图片上传到服务器前&#xff0c;先预览的功能。当时用html的<input type"file"/>标签一直实现不了&#xff0c;最后舍弃了这个标签&#xff0c;使用了其他方式来实现了这个功能。 今天无意发现了一个知识点&#…

Android Studio3.0简介

Android Studio 3.0.0 Android Studio 3.0.0 (2017年10月)是一个主要版本&#xff0c;包括各种新功能和改进 Android插件的Gradle 3.0.0 • 支持Android 8.0 • 支持Java 8库和Java 8语言功能&#xff08;没有Jack编译器&#xff09; • 支持Android测试支持库1.0&#xff08;A…

什么是JavaBean、Bean? 什么是POJO、PO、DTO、VO、BO ? 什么是EJB、EntityBean?

前言&#xff1a; 在Java开发中经常遇到这些概念问题&#xff0c;有的可能理解混淆&#xff0c;有的可能理解不到位&#xff0c;特此花了很多时间理顺了这些概念。不过有些概念实际开发中并没有使用到&#xff0c;可能理解还不够准确&#xff0c;只能靠后续不断纠正了。 1、什么…

【GlobalMapper精品教程】037:构建泰森多边形(Thiessen Polygon)实例精解

泰森多边形是进行快速插值和分析地理实体影响区域的常用工具。例如,用离散点的性质描述多边形区域的性质,用离散点的数据计算泰森多边形区域的数据。泰森多边形可用于定性分析、统计分析和临近分析等。 文章目录 一、泰森多边形的概念二、泰森多边形的特点三、泰森多边形构建…

WPF 实现 Gitee 泡泡菜单「完」

WPF 实现 Gitee 泡泡菜单「完」气泡菜单「完」作者&#xff1a;WPFDevelopersOrg原文链接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40&#xff1b;Visual Studio 2022;项目使用 MIT 开源许可协议&#xff1b;需要实现泡泡菜单需…

Fiddler抓包5-接口测试(Composer)

前言 Fiddler最大的优势在于抓包&#xff0c;我们大部分使用的功能也在抓包的功能上&#xff0c;fiddler做接口测试也是非常方便的。 对应没有接口测试文档的时候&#xff0c;可以直接抓完包后&#xff0c;copy请求参数&#xff0c;修改下就可以了。 一、Composer简介 点开右侧…

【GlobalMapper精品教程】038:模拟水位上升(洪水淹没分析)案例教程

基于数字高程模型 ( DEM )格网模型,实现给定水深情况下洪水淹没区的计算模型,讨论洪水淹没演进过程可视化实现的关键技术,以三维可视化方式,动态而形象地模拟在指定洪水水位下的洪水淹没演进过程。 文章目录 一、洪水淹没效果二、洪水淹没实现三、查询淹没区域面积参考教程…

【.NET6+Avalonia】开发支持跨平台的仿WPF应用程序以及基于ubuntu系统的演示

前言&#xff1a;随着跨平台越来越流行&#xff0c;.net core支持跨平台至今也有好几年的光景了。但是目前基于.net的跨平台&#xff0c;大多数还是在使用B/S架构的跨平台上&#xff1b;至于C/S架构&#xff0c;大部分人可能会选择QT进行开发&#xff0c;或者很早之前还有一款M…

SOA架构和MSA架构之间的关系

目录 一、传统架构&#xff1a;简单单体模式 二、分布式架构&#xff1a;面向服务架构&#xff08;SOA&#xff09; 1、服务与SOA 2、SOA战略 3、SOA的两大基石&#xff1a;RPC和MQ 三、分布式架构&#xff1a;微服务架构&#xff08;MSA&#xff09; 什么是微服务 微服…

Linux系统文件与目录权限管理

Linux文件目录权限管理 一、Linux文件属性及权限 1、Linux文件及目录权限及属性说明 &#xff08;1&#xff09;权限及属性说明 &#xff08;2&#xff09;文件权限说明 三种权限说明&#xff1a;r 读 read w 写 write x 执行 excute 2、修改文件属主及属组 &#xff08;1&am…

scala学习手记28 - Execute Around模式

我们访问资源需要关注对资源的锁定、对资源的申请和释放&#xff0c;还有考虑可能遇到的各种异常。这些事项本身与代码的逻辑操作无关&#xff0c;但我们不能遗漏。也就是说进入方法时获取资源&#xff0c;退出方法时释放资源。这种处理就进入了Execute Around模式的范畴。 在s…

【时序数据库InfluxDB】Windows环境下配置InfluxDB+数据可视化,以及使用 C#进行简单操作的代码实例...

前言&#xff1a;如题。直接上手撸&#xff0c;附带各种截图&#xff0c;就不做介绍了。1、influxDB的官网下载地址 https://portal.influxdata.com/downloads/打开以后&#xff0c;如下图所示&#xff0c;可以选择版本号&#xff0c;以及平台。此处咱们选择windows平台。不过…

官宣 微软跨平台 UI 框架 .NET MAUI 6 正式发布

微软宣布 .NET MAUI 已正式 GA。 .NET MAUI (.NET Multi-platform App UI) 是一个跨平台 UI 框架&#xff08;前身是 Xamarin.Forms&#xff09;&#xff0c;用于通过 C# 和 XAML 创建原生移动和桌面应用。基于 .NET MAUI&#xff0c;开发者可在单个共享代码库中创建同时支持 A…

《.NET物联网从零开始》系列

近日搞硬件网关时&#xff0c;那些残存的数电、模电和通信原理的记忆时常在脑海中萦绕&#xff1b;想起来多年前看张高兴的博客学会了.netcore树莓派进行物联网开发。使用dragonboard(龙板)搭载windows 10 iot系统&#xff0c;配合光电传感器和rfid实现了一个项目原型。碰巧逛g…

设计好接口的 36 个锦囊(原则)

目录 设计好接口的 36 个锦囊 | 接口参数校验 | 修改老接口时&#xff0c;注意接口的兼容性 | 设计接口时&#xff0c;充分考虑接口的可扩展性 | 接口考虑是否需要防重处理 | 重点接口&#xff0c;考虑线程池隔离 | 调用第三方接口要考虑异常和超时处理 | 接口实现考虑…

嵌入式第11次实验

嵌入式软件设计第11次实验报告 学号&#xff1a;140201236 姓名&#xff1a;沈樟伟 组别&#xff1a;第2组 实验地点&#xff1a;D19 一、实验目的&#xff1a; 1、了解短信AT指令的使用方法。 2、掌握使用短信AT指令驱动SIM900A发送和接收短信的方…

Linux文件系统之df

df用于查看当前挂载的文件系统-a 查看所有的文件系统可以自己指定容量单位&#xff0c;-BM -BG 但是还是h的选项好用-i 查看inode的使用信息-l(L) 显示本地文件系统--output 可以指定管理员想要看的列--outputField_List可用的字段有source fstype itotal iused iavail ipcent …

普通老实人的生活

2019独角兽企业重金招聘Python工程师标准>>> 有一个朋友&#xff0c;他家有一套营业房&#xff0c;租给了两个年轻人&#xff0c;合同签订为半年&#xff0c;房租7000&#xff0c;合同到期当天&#xff0c;乙方一直没有联系甲方&#xff0c;说明续租或不续租&#x…

如何在 C# 中运行 Python 代码

前言Python是一门强大的编程语言。特别的是&#xff0c;它还具有众多出色的库&#xff08;例如numPy&#xff0c;sciPy&#xff0c;pandas等&#xff09;&#xff0c;可以显著简化和加速开发。因此&#xff0c;在解决某些问题时&#xff0c;通过 Python 实现可能是最理想的方式…