在现代的应用程序开发中,用户界面的直观性和功能性是至关重要的。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