
UWP开发
singhwong
C#,UWP,.Net
展开
-
uwp集合列表数据上下文命令绑定
public class TestCommand : ICommand { public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) { return true; } public void Execute(object parameter) { ...原创 2021-03-01 16:44:54 · 177 阅读 · 0 评论 -
网络通信
1. Socket通信在Windows.Networking.Sockets命名空间下提供了支持Socket通信相关的类型。有趣的是,这些类型的命名中并没有出现如TCP、UDP等关键词,官方似乎有意避开这些传统的命名方式,而是按照各通信协议的功能来命名。可参考如下:DatagramSocket ——用UDP协议的Socket网络通信StreamSocket —— 通过流方式接收/发送网络数据,实际上是基于TCP协议的Socket通信。在服务器端,可以使用StreamSocketListener来监听原创 2020-12-28 01:33:32 · 573 阅读 · 0 评论 -
文件与数据
@[TOC]1. 文件与目录#(1) 文件/目录操作的相关类型与文件/目录操作有关的类型主要分布在Windows.Storage命名空间及该命名空间下的子命名空间中。下面列出了与文件/目录操作有关的几个重要类型。StorageFile 表示一个文件类型,通过该类,可以对某个文件进行一些常用操作,例如重命名、删除、获取基本属性等StorageFolder 表示一个目录实例,可以对某个目录进行重命名、复制、删除等操作KnownFolders 一个静态类型,公开一系列静态属性,通过这些属性可以直接获取原创 2020-12-22 03:51:02 · 649 阅读 · 0 评论 -
激活远程系统上的应用
从build 14393版本开始,UWP应用将支持启动远程计算机系统上的应用。要启动远程系统上的应用,需要使用RemoteLauncher类,并通过URI来激活远程应用。在调用远程系统上的应用前,必须查找可用的远程系统。远程系统相关的信息由RemoteSystem类进行封装。发现远程系统可以有两种方法:第一种方法是直接调用FindByHostNameAsync方法,通过指定的远程计算机的名字来查找;第二种方法是调用CreateWatcher方法,创建一个RemoteSystemWatcher实例,最终由原创 2020-12-22 03:28:55 · 331 阅读 · 0 评论 -
协议激活(uwp)
为应用程序注册协议后,可以通过URI来激活当前应用程序,并且还可以在激活应用程序的URI中附加上参数,应用程序在完成激活操作的过程中可以根据URI传递的参数来做出相应的处理。协议URI是以协议名称开头,后面紧跟一个英文冒号。冒号后面的内容可以根据实际情况来定义,是可选的。假设某个应用程序注册了名为"topic"的协议,那么要激活该应用程序的话,可以使用Launcher类的LaunchUriAsync方法启动,传入方法参数的URI为:topic:带参数的URI可以这样写:topic:12345冒原创 2020-12-20 18:09:25 · 490 阅读 · 1 评论 -
自定义文件关联(uwp)
声明文件类型关联,即可以将当前应用程序加入到已有文件类型的"打开方式"列表中,也可以为应用程序声明新的文件类型,当用户单击打开文件时,系统会启动当前应用程序,因此,开发者需要对应用程序的激活事件进行处理。当通过某个文件激活时,通常的处理方案是显示该文件的内容。下面通过示例来演示如何将应用程序与自定义类型的文件关联。本示例需要三个应用程序页面:MainPage为主页,用于输入文件的内容,然后将输入的内容保存到文件;FilesPage页面用来显示已经保存的文件列表,当用户单击文件后,会使用当前应用程序来打开原创 2020-12-20 01:45:43 · 487 阅读 · 0 评论 -
转码
Windows.Media.Transcoding命名空间下提供了相关API,支持对音/视频文件进行转码处理。这些API已经由官方封装好,使用起来比较方便。通俗一点说,多媒体文件转码就是将音/视频文件从一种格式转换为另一种格式,如将AVI格式的视频转换为MP4格式的视频。实现多媒体转码的一般步骤如下:(1). 实例化MediaTranscoder对象。(2). 调用PrepareXXXTranscoderAsync方法,异步等待执行后会得到一个PrepareTranscodeResult对象实例原创 2020-12-17 17:15:27 · 817 阅读 · 0 评论 -
人脸检测(图像处理)
FaceDetector类支持从指定的位图中检测出人脸所在的区域,检测结果用DetectedFace对象表示。人脸检测结果可以从DetectedFace类公开的FaceBox属性中获取,包含人脸区域相对于位图的位置,例如X和Y坐标,以及宽度和高度。FaceDetector公开一些静态成员,用以在使用FaceDetector之前进行相关的验证。如果当前设备不支持人脸检测,则IsSupported属性会返回false。如下代码片段所示: bool isSupport = Fa原创 2020-12-16 18:55:40 · 1244 阅读 · 0 评论 -
图像处理
这里所说的图像处理是指通过修改图像的像素数据,从而改变图像的呈现效果。在实际开发中,比较常用的是为图像添加滤镜,如浮雕效果等。编辑像素数据实际上是对每个像素点中的各个颜色通道值进行修改以达到预期结果。通常像素点包含红色(R)、绿色(G)、蓝色(B)以及A(不透明度,即Alpha值)4个通道,A值一般不用修改,许多情况下都是对RGB三原色进行一些算法运行。图像处理的各种算法可以通过查阅资料,或者网络搜索直接获取。在编辑像素数据之前,读者应简单了解一下几种像素格式。BitmapPixelFormat枚举原创 2020-12-16 17:54:41 · 811 阅读 · 0 评论 -
图像的解码与编码
尽管使用BitmapImage等类型可以对图像文件进行解码,但是,如果图像文件包含多个帧(如Gif图像一般包含多个帧),或者需要对图像进行修改后并保存为新的文件,那么BitmapImage类是无法胜任的。因此在实际开发中,是需要用到图像的编码与解码技术的。1. 图像解码对图像文件进行解码需要使用BitmaDecoder类(位于Windows.Graphics.Imaging命名空间),该类包装了图像解码的一系列功能。下面将用示例来演示如何对Gif图像文件进行解码,并显示Gif文件中各个帧的图像。原创 2020-12-16 17:12:37 · 6143 阅读 · 0 评论 -
可写位图(WriteableBitmap)
WriteableBitmap派生自BitmapSource类,因此它属于内存位图,不过WriteableBitmap类公开了表示图像像素数据的PixelBuffer属性,可以通过该属性在运行时写入或修改像素数据,以达到编辑图像的效果。下面示例演示通过向WriteableBitmap对象写入像素数据的形式来动态创建内存图像。通过代码生成的内存图像将显示在Image控件中,Button控件的Tapped事件处理代码如下: private async void Button_Ta.原创 2020-12-14 02:01:47 · 2357 阅读 · 2 评论 -
将可视化对象呈现为图像
使用RenderTargetBitmap类,可以将用户界面上的某个可视化元素以及它的子元素呈现到内存图像中。只需简单调用RenderAsync方法就可以完成,在调用方法时传入的可视化对象类型要求为UIElement,也就是说,只要是从UIElement类派生的类型实例都可以在RenderTargetBitmap位图中呈现。接下来将通过示例来演示RenderTargetBitmap类的用法。示例的XAML代码如下: <ScrollViewer> <Grid原创 2020-12-14 01:39:41 · 304 阅读 · 0 评论 -
动画(uwp)
动画概要动画实质上是一系列静止的图像,随着时间的推移不断进行切换,由于人眼的视觉反应存在误差,使连续播放的静止画面看起来是运动的,而某段时间内所切换的每一个静态画面被称为"帧"。假设在1秒内播放了25个静态画面,就可以称作"25帧/秒"。1.时间线(Timeline)...原创 2020-12-10 18:11:24 · 711 阅读 · 1 评论 -
三维变换(PerspectiveTransform3D、CompositeTransform3D)
表示三维变换的公共基类是Transform3D,并派生出两个子类——PerspectiveTransform3D和CompositeTransform3D。通常PerspectiveTransform3D与CompositeTransform3D会搭配使用。PerspectiveTransform3D主要负责视角的调整,通过Depth属性设置观察点与可视化对象的距离(即与Z轴原点的距离,取值必须大于0),OffestX属性和OffestY属性用于设定观察点的位置,参照点为X轴和Y轴的原点。正是由于P原创 2020-12-10 15:14:48 · 742 阅读 · 0 评论 -
三维透视
使用PlaneProjection类能够实现在二维平面上产生类似于三维视觉的效果,主要是通过在X、Y、Z三个坐标轴上应用平移或者旋转变换来完成透视处理的。在运行PlaneProjection类之前,应当简单了解一下透视变换的坐标系结构。假设用户正对着设备屏幕,那么,屏幕上水平方向为X轴,向右延伸为正方向,向左则为负方向;屏幕竖直方向为Y轴,正方向朝上,负方向朝下;而Z轴是垂直于屏幕所在的平面,正方向指向用户自己,负方向指向屏幕背面。接下来,还要知道,在透视变换中有两个坐标控件——全局坐标和本地坐标。原创 2020-12-09 18:05:35 · 1021 阅读 · 0 评论 -
二维变换
二维变换就是在不改变几何图形原有参数的前提下,对图形进行平移、旋转、缩放等操作。完成这些变换操作的类型都从Transform类派生。任何可视化对象都可以使用二维变换,如UIElement类公开的RenderTransform属性,Brush类和Geometry类的Transform属性,都可以设置关联的变换对象。因为所有的控件类型都是UIElement的子类,所以所有控件都可以应用二维变换。1. 平移(TranslateTransform)平移变换通过指定X轴和Y轴上的平移量来确定移动方向。Tran原创 2020-12-09 12:58:06 · 708 阅读 · 1 评论 -
Path(图形)
路径(Path类)也是从Shape类派生的,但路径可以创建复杂的几何图形。Path类公开Data属性,类型为Geometry(位于Windows.UI.Xaml.Media命名空间),它表示几何图形的基类,一般不直接使用该类。从Geometry派生的表示几何图形的类型大致可以划分为两种。单一图形:LineGeometry、RectangleGeometry、EllipseGeometry 复合图形:PathGeometry、GeometryGroupLineGeometryLineGeome原创 2020-12-07 15:13:56 · 681 阅读 · 0 评论 -
折线(Polyline)、多边形(Polygon)
PolylinePlayline所绘制的图形由多个线段组成,因此它公开Points属性,它表示一系列坐标点的集合。这些点将用于描述Polyline图形中各线段相接处的顶点(包括起点和终点)。Points集合在XAML中可以直接用字符串写上多个点,书写方法有两种:每个坐标点之间使用至少一个空格开分隔,横坐标和纵坐标用英文的逗号分隔。 一个坐标点的横坐标与纵坐标用一个空格来分隔,这时候点与点之间就不能用单个空格来分隔了,因为这样书写会很混乱,编译器无法识别,因此点与点之间至少要用两个空格来分隔。示原创 2020-12-07 14:46:01 · 10476 阅读 · 1 评论 -
基本图形:直线(Line)
能够直接在XAML中使用的图形对象都派生自Shape类,此处的"基本图形"是相对于路径对象(Path类)而言的,路径可以绘制出比较复杂的图形,而其他图形类一般用于构建相对简单且独立的几何图形,如矩形、椭圆(包括正圆)、直线、多边形等。线条是最简单的几何图形,通过两个坐标点就可以确定一个Line对象,即线条的起点与终点。在Line类中,X1属性表示起点的横坐标,Y1属性表示起点的纵坐标;X2属性表示终点的横坐标,Y2表示终点的纵坐标。由于Line对象仅仅是一段单独的线条,它不存在内部区域,因此Line原创 2020-12-06 23:08:40 · 1894 阅读 · 0 评论 -
画刷(Brush)
线性渐变画刷(LinearGradientBrush)线性渐变画刷通常由起点、终点及渐变点组成。渐变点可以存在一个或多个,起点与终点定义渐变点排列的方向,各个渐变点分布在起点和终点所在的直线上,而单个渐变点则由颜色值和位置来确定。两个渐变点之间的区域为颜色过渡区域。示例: <Line X1="50" Y1="87" X2="435" Y2="445" StrokeThickness="20" StrokeDashArray="2">原创 2020-12-06 22:50:41 · 752 阅读 · 0 评论 -
直接绑定到方法(x:Bind)
UWP提供了一个功能类似于Binding的XAML扩展标记——x:Bind。与Binding不同的是,x:Bind扩展标记是在编译阶段完成绑定,可以节省运行阶段的性能开销。正因为如此,x:Bind标记需要强类型的数据源,这意味着,x:Bind标记的绑定上下文不再是对象的DataContext属性,而是Page类与UserControl类,或者它们的派生类。x:Bind标记的另一个亮点是:它可以直接绑定到方法,该方法可以是静态方法,也可以是实例方法,比较典型的一种应用场景就是将控件的某个事件直接与目标方法原创 2020-12-06 12:11:27 · 875 阅读 · 0 评论 -
增量加载
适合用于数据源来自网络的场景,如果网络状态欠佳,获取数据会耗费更长的时间,让用户一直等待将所有数据加载完成再进行下一步操作,有损用户体验。一个较好的方案是先提取一部分数据,当用户需要查看更多数据时再实时加载,这样做可以大大缩短提取数据的时间,改善用户体验,这种方案可称为增量加载。增量加载由ListViewBase类支持,只有从ListViewBase类派生的控件类型才支持增量加载(如 ListView、GridView等)。此外,作为数据源的集合对象需要实现ISupportIncrementalLoa.原创 2020-12-06 11:15:22 · 749 阅读 · 0 评论 -
FlipView控件
FlipView控件是比较特殊的集合控件,ListBox等控件可以在屏幕上呈现多个项目的,而FlipView控件每次只显示一个项。不能认为FlipView控件和Pivot控件是一样的,尽管二者有相似之处。因为Pivot控件的侧重点是视图之间的切换,而FlipView控件主要展现的是数据项。FlipView控件使用起来与其他集合控件没有区别,读者通过下面示例就可以轻松掌握。本示例将在FlipView控件中添加4个Image对象,分别用于显示4张图片。具体的XAML如下:// to doFli原创 2020-12-03 21:29:21 · 593 阅读 · 0 评论 -
Hub控件示例
Hub控件显示的是全景视图,即所有视图都被排列到一个平面中,当Hub控件中所包含的视图数量较多时,由于屏幕空间不足以显示所有视图,因此只有当前视图会显示在屏幕内部,其他视图会被移动到屏幕外,这时候,用户就看不到屏幕之外的内容。Hub控件在手机设备上运行时效果比较直观,因为手机设备的屏幕尺寸通常要比平板电脑小,更易于观察展现效果。下面示例将演示Hub控件的基本用法。核心的XAML代码如下:// to do示例中,Hub控件定义了三个视图,标题分别为。通常,为了使用户界面看起来更美观,会使用图像作原创 2020-12-03 21:28:17 · 287 阅读 · 0 评论 -
清除导航堆栈
有时候需要清除导航堆栈中的信息,如://查找与页面B相关的记录var r = this.Frame.BackStack.FirstOrDefault(p=>p.SourcePageType == typeof(Page_B));//删除一条回退记录if(r != null){ Frame.BackStack.Remove(r);}原创 2020-12-03 18:48:07 · 230 阅读 · 0 评论 -
缩放视图
尽管可以对数据进行分组,,但如果分组比较多,也不方便用户查看,因此需要用到SemanticZoom控件,该控件需要配合ListView或GridView控件一起使用,是数据视图具有缩放功能。所谓缩放视图,就类似一个可以折叠的数据列表。当视图折叠后,用户只能看分组数据的组标题;当视图展开后,用户就能看到所有的数据项。SemanticZoom控件有两个主要属性分别代表数据的“收缩”视图和"放大"视图。ZoomedInView属性表示数据的"放大"视图,即展开所有数据项;ZoomedOutView属性则表示"原创 2020-11-26 18:41:06 · 250 阅读 · 0 评论 -
自定义数据项的布局
ItemsControl控件有一个ItemsPanel属性,其作用是为集合控件中的列表项定义布局面板。通过这种方式可以改变列表项的排列方式。下面示例将演示如何动态改变ItemsPanel属性来调整ListView控件中列表项的排列方式。首先在页面的资源集合中声明两个ItemsPanelTemplate实例,分别使用VirtualizingStackPanel和WrapGrid两个布局控件来定义列表项的布局方式。// to do示例应用的主页面布局如下面XAML所示:// to do原创 2020-11-24 22:52:09 · 149 阅读 · 0 评论 -
分组视图
当数据项数量较大的时候,为了让用户能够快速找到要查看的项,应该对数据进行分组。ItemsControl控件公开GroupStyle属性,用来设置分组视图的样式,它是一个GroupStyle对象列表,列表中的每个GroupStyle对象代表一个层次的分组。如果列表中只有一个GroupStyle对象,则表示分组视图只呈现顶层分组;如果列表中有两个GroupStyle对象,则分组视图将呈现两个层次的分组。一般来说,只需要一层分组就可以了,分组层次过多会导致应用程序界面混乱,对用户体验造成负面影响。GroupS原创 2020-11-24 22:48:31 · 1075 阅读 · 0 评论 -
数据模板选择器
一般情况下,为集合控件定义了数据模板后,数据视图中的每一个子项都会套用相同的模板,即每个项都呈现相同的布局。然而在某些特殊情况下,可能需要让集合中的一个或多个数据项应用不同的模板。例如,一个呈现实时新闻的数据视图,开发者可能会做这样的安排:如果新闻内容是以文字为主的,则显示新闻标题和摘要如果新闻内容是以图片为主的,即图片新闻,则显示新闻标题和图片的缩略图。要让数据项能够有选择地加载不同的数据模板,需要实现数据模板选择器,即从DataTemplateSelector类(位于Windows.UI.Xaml.原创 2020-11-24 22:44:41 · 210 阅读 · 0 评论 -
DisplayMemberPath与SelectedValuePath
DisplayMemberPath和SelectedValuePath是两个属性成员,但它们并不是来自同一个类。DispalyMemberPath属性由ItemsControl类公开,而SelectedValuePath是Selector类的属性。当向ItemsControl控件添加的对象如果不是可视化对象时,会调用该对象的ToString()方法来获得该对象的字符串表示形式,然后在ItemsControl控件中使用TextBlock控件来呈现。这就引出一个新的问题:如果对象的类型是复合类型,或者开发者原创 2020-11-22 23:07:52 · 2859 阅读 · 1 评论 -
更改通知
有些时候,可能存在多个UI视图共用一个数据源的情况,在这种情况下会出现一个问题:其中一个视图通过双向绑定修改了数据内容并且对数据源进行更新,开始另外一个视图并没有及时收到更新通知,尽管数据已经发生了更改,但仍然显示旧的数据内容。这种视图之间不同步的情形显得不合理,于是就需要一种技术,能够让共用数据源的所有视图都能在数据更新后及时得到通知以获取最新的内容。这种技术可以称为"更改通知",实现方式比较简单,让作为数据源的类型实现INotifyPropertyChanged接口。INotifyPropertyC原创 2020-11-22 13:49:30 · 328 阅读 · 0 评论 -
转换器
class BoolToVisibilityConverter:IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { bool? b = (bool?)value; //如果传入的值为true,则返回Visible if (b ...原创 2020-11-22 11:18:39 · 260 阅读 · 0 评论 -
Binding扩展标记
为了在XAML中也能够使用Binding类进行数据绑定,XAML语法规范提供了Binding扩展标记,可将Binding对象直接赋值给可视化对象的属性成员。如:// to do上面代码将一个Binding实例赋值给TextBlock控件的Text属性以实现数据绑定,Text属性会自动从Binding对象中提取数据内容。Binding扩展标记还可以进行简写,即直接用字符串形式赋值给目标属性。简写后的Binding标记必须放到一对大括号( {} )中,以告诉编译器这不是普通的文本,而是扩展标记。例原创 2020-11-22 10:22:08 · 295 阅读 · 0 评论 -
Binding类
Binding类用于定义一项数据绑定,绑定目标属性可以通过Binding对象与数据源关联。但必须注意的是,只有依赖项属性才能使用Binding对象进行绑定,普通的CLR属性是不能使用Binding的,因此许多控件的公共属性都定义为依赖项属性。下面通过一个例子向读者讲述如何使用Binding类实现数据绑定。如下面XAML代码所示,在页面中声明4个TextBlock控件,前两个TextBlock控件用于呈现提示性文本,后两个TextBlock控件则用于显示数据。// to do在本例中,把一个原创 2020-11-22 09:34:27 · 649 阅读 · 0 评论 -
墨迹处理(InkCanvas)
InkCanvas是一种特殊控件,在应用程序运行后,它不会呈现任何内容,不过,它可以收集用户通过鼠标、手指或笔所输入的数据,这些数据称为"墨迹(Inking)"。只要用户的输入操作是在InkCanvas控件的区域内,它就可以收集输入的墨迹。InkCanvas控件公开InkPresenter属性,类型是位于Windows.UI.Input.Inking命名空间下的InkPresenter类。这个类用于配置墨迹收集相关的参数,例如墨迹的呈现颜色,呈现大小等。每当InkCanvas控件完成一次墨迹收集时会引发原创 2020-11-21 19:37:52 · 1118 阅读 · 0 评论 -
捕捉HTML内容(WebView)
CapturePreviewToStreamAsaync方法可以将WebView当前所呈现的内容保存到字节流中,以做进一步处理,如保存为图像文件。读者要注意的是,CapturePreviewToStreamAsync方法只能捕捉WebView中可见的那部分内容,如果HTML内容较多,WebView需要滚动才能看全部内容时,只有已经在WebView控件上呈现出来的那部分内容才会被捕捉到,其他不可见的内容将被忽略。下面示例使用CapturePreviewToStreamAsuync捕捉WebView中的原创 2020-11-21 16:44:06 · 566 阅读 · 0 评论 -
执行脚本函数(WebView)
调用WebView的InvokeScriptAsync方法可以通过程序代码来执行HTML内容中的脚本代码,InvokeScriptAsync方法的定义如下:// to do该方法支持异步等待,调用完成后会返回一个string值,如果被执行的脚本函数有返回值,那么脚本函数将以字符串的形式将结果通过InvokeScriptAsync方法返回。在调用InvokeScriptAsync方法时,要注意scriptName参数必须是脚本函数的正确名字,如果函数名错误,将无法执行脚本函数。传递给脚本函数的参数可原创 2020-11-21 16:41:32 · 582 阅读 · 1 评论 -
自定义控件
当用户控件也不能满足实际开发需求时,开发者可以编写自己的控件——自定义控件。一般来说,自定义控件应该从Control类派生,当然在需要的时候,也可以ongoing现有的控件类派生。在控件模板中,除了可以定义控件的外观外,还可以声明控件的可视化状态(Visual State),允许开发者在逻辑代码中操作控件的状态切换。下面通过实例来向读者说明自定义控件的开发过程。该示例即将完成一个简单的控件,控件中显示一张图片,当操作者在图片上按下鼠标时,会在图片底部显示文本;当松开后文本会隐藏。在项目中添加自定原创 2020-11-21 16:39:10 · 1207 阅读 · 0 评论 -
嵌入自定义字体
在一些应用中,可能需要使用一些第三方字体,以增强UI的表现能力,但是系统中默认没有这种字体,当应用程序安装到设备上,所使用的字体会失效,并被还原为默认字体。为了使第三方字体能够用于发布环境中,开发者应当考虑将字体文件作文应用程序资源嵌入到应用程序中。下面通过示例来演示一下如何在应用项目中嵌入字体。首先,在"解决方案管理器"窗口中右击,从弹出的快捷菜单中依次执行"添加"-"现有项"命令将字体文件添加到项目中。随后在XAML中就可以使用字体了,但不能直接使用字体名称来设置可视化对象的FontFami原创 2020-11-21 00:27:26 · 283 阅读 · 0 评论 -
PopupMenu
PopupMenu类公开Commands属性,类型为UICommand对象列表,每个UICommand对象表示一个菜单项。相信读者对UICommand类不会陌生,MessageDialog类也是使用UICommand类定义命令项。UICommand在对话框中呈现为按钮,而在菜单项中呈现为菜单项。弹出上下文菜单有两种方式:调用ShowAsync方法:显示上下文菜单,方法参数指定显示菜单的坐标点。位置坐标的参考对象为当前窗口,在手机上可以以当前屏幕为参照(应用程序占满整个屏幕)。 调用ShowForS原创 2020-11-21 00:26:21 · 385 阅读 · 0 评论