探索XAML/C# Metro风格应用中的绘图与手写识别

在现代的应用程序开发中,用户界面的直观性和功能性是至关重要的。Metro风格应用以其简洁、现代的界面设计而受到用户的喜爱。本文将探讨如何在XAML/C# Metro风格应用中实现绘图功能和手写识别技术。

绘图功能的实现

XAML/C# Metro风格应用中,实现绘图功能需要使用到Windows.UI.Xaml.Shapes命名空间和指针事件。由于Metro风格应用中没有鼠标事件,因此所有的绘图操作都是通过PointerMoved、PointerReleased和PointerPressed事件来完成的。所有的绘图操作都是在画布上进行的。

为了选择绘图工具,使用了switch case结构。这些工具基本上是按钮,使用的图标是"Segoe UI Symbol"字体。使用字符映射表来获取所需的图标。

在PointerPressed事件中绘制组件时,保存了当前的坐标,然后在PointerMoved事件后,保存了第二个坐标。这些坐标可以直接用于绘制线条,但对于其他形状,通过坐标的差值来获取高度和宽度。

自由手绘制工具只是在PointerPressed事件中添加路径中的点。Metro应用不能通过编程关闭,因此关闭按钮将挂起应用,一段时间后任务管理器将关闭应用以释放资源。

颜色组合框是通过编程填充的。以下是代码片段:

C# var colors = typeof(Colors).GetTypeInfo().DeclaredProperties; foreach (var item in colors) { cbBorderColor.Items.Add(item); cbFillColor.Items.Add(item); }

由于WinRT中没有渲染方法,因此无法将绘制的对象保存为图像。此外,AdornerDecorator也不可用,因此无法调整和移动组件。希望微软能够更新WinRT以添加缺失的功能。

手写识别的实现

为了实现手写识别,使用了Windows.UI.Input.Inking命名空间。基本概念是使用InkManager类。它提供了属性和方法来管理输入、操作和处理(包括手写识别)一个或多个InkStroke对象。当用户在画布上写东西时,所有覆盖的点都被保存为InkManager对象。

InkManager类提供了一个名为RecognizeAsync()的异步方法。识别的结果是一个InkRecognitionResult对象的集合。为了获取文本组件,使用了InkRecognitionResult类的GetTextCandidates()方法,它检索出被认为是手写识别潜在匹配的字符串集合。以下是代码片段:

C# private async void btnRecognize_Click(object sender, RoutedEventArgs e) { try { txtRecognizedText.Visibility = Windows.UI.Xaml.Visibility.Visible; btnSaveRecognizedText.Visibility = Windows.UI.Xaml.Visibility.Visible; canvas.SetValue(Grid.RowProperty, 3); canvas.SetValue(Grid.RowSpanProperty, 1); MyInkManager.Mode = InkManipulationMode.Inking; x = await MyInkManager.RecognizeAsync(InkRecognitionTarget.Recent); MyInkManager.UpdateRecognitionResults(x); foreach (InkRecognitionResult i in x) { RecognizedText = i.GetTextCandidates(); FinalRecognizedText += " " + RecognizedText[0]; txtRecognizedText.Text += FinalRecognizedText; } FinalRecognizedText = string.Empty; } catch (Exception) { if (canvas.Children.Count == 0) { var MsgDlg = new MessageDialog( " Your screen has no handwriting. " + " Please write something with pencil tool then click recognize." , " Error while recognizing" ); MsgDlg.ShowAsync(); } else { var MsgDlg = new MessageDialog( " Please clear the screen then write " + " something with pencil tool" , " Error while recognizing" ); MsgDlg.ShowAsync(); } } }

应用的亮点

本应用展示了用户如何在XAML/C#Metro风格应用中绘制形状以及如何进行手写识别。请求其他开发者通过他们的评论和建议来增强应用程序。非常感谢CodeProject、StackOverflow和MSDN论坛帮助解决问题。

有一天在寻找更好的绘画应用时,发现了这两个完全从本文复制粘贴的应用。建议微软不要接受这些类型的垃圾应用。

Rainy Paint

PaintMetroStyle

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485