Edi Wang

All Posts 301


在UWP应用中调用Windows 10 Feedback Hub发送用户反馈

我们的应用上架后,有非常多的途径可以让用户发送反馈,比如留下邮箱、商店评论,甚至自己写个API来收集反馈。但其实,Windows 10的Feedback Hub也是可以为我们所用的。 熟悉Windows Insider的朋友都知道,Windows 10安装完成后,系统自带一个Feedback Hub,这里面通常都是用户对Windows这一款产品的的反馈。其实,现在这个Feedback Hub也可以给开发者用来收集用户的意见。 那么,在UWP里如何调用这个Feedback Hub呢?首先,你需要安装微软官方的Engagement SDK,方法如下: 1. 在NuGet中为你工程安装这个包:Microsoft.Services.Store.Engagement PM Install-Package Microsoft.Services.Store.Engagement 2. 如果...

UWP

UWP应用中自定义亚克力材质

Windows 10 秋季更新(Build 16299)中引入了亚克力材质,这是一种类似于Windows 7窗口磨砂玻璃效果的Brush。 很多Windows自带的应用,比如计算器,就引入了这样的设计。然而,系统自带的画刷有时候无法满足我们自己设计App的需求,特别是在Windows决定不渲染亚克力效果的时候,比如设备在低电量模式下运行,或者窗口非激活状态下,很多系统默认画刷会让我们App的界面变的很丑。 比如,这是正常的亚克力效果: 窗口inactive的时候竟然变成了: 这时候就需要我们自定义亚克力的参数,并且定义fall back的配色方案。比如我的"Character Map UWP",就是使用自定义亚克力的一个例子。 正常状态显示自定义透明度的黑色: 全屏或者inactive状态,显示系统主题色: 这样的效果,是通过自定义AcrylicBrush...

UWP

在UWP应用中响应键盘快捷键

一个优秀的Windows应用不仅要面向鼠标、触屏用户,同时还需要兼顾到键盘操作,特别是一些常见的快捷键,比如撤销(CTRL + Z),以提供全面的用户体验。 那么在UWP里如何定义键盘快捷键呢,以我的《描图》APP为例,我需要实现撤销的快捷键(CTRL + Z)。首先,我们需要定义快捷键的操作,是用户当前焦点在哪个控件上的,如果需要整个应用界面都监听键盘操作,那么这个UI控件就是XAML页面最外层的容器:GRID 所以,首先我们在Page下面的第一级Grid,也就是最外层容器上,定义2个事件:KeyDown和KeyUp,如下: 接下来,因为我们想操作的快捷键(CTRL + Z)是个组合键,所以我们需要知道用户是否按同时按下了CTRL键和Z键,为此,我们要定义一个布尔变量用来标识CTRL是否已被按下的状态: private bool _isCtrlKeyPressed; 然后定...

UWP

Show Confirm Dialog When User Close UWP App

When our UWP Application deal with user data in it, e.g. like drawings or documents, we usually want to make sure user won't close the App by accident and lose their work. Just like what you see in a Office application, it will ask you if you want to save your document before close the App. For a long time, UWP could not do that in a normal way. Because it is not a general public API and it is st...

UWP

Windows 10 秋季更新上用编程方式重启UWP应用

有时候,我们的UWP应用会要求用户重启,以应用一些设置。通常情况下,用户只能手工关闭App并再次打开完成重启的步骤。其实,在Windows 10秋季更新里,开发者已经可以通过编程方式,让用户一键完成自动重启App的工作。 比如我的“Character Map UWP”这个应用,在用户更改设置后,需要重启生效。那么第一步,就是在设置页面加一个重启按钮“Restart Now”: 然后,我们需要通过秋季更新中的全新牛逼API RequestRestartAsync(String) 来完成重启。 这个API的签名如下: public static IAsyncOperation RequestRestartAsync(String launchArguments) 如果只是为了完成重启,不需要参数,那么lauchArguments是可以留空的。 所以,在我的这个例子里,最简单...

UWP

在 Windows 10 秋季更新上安装 Linux 子系统

纳德拉说,微软爱Linux。这真的不只是说说,居然还做到了!最近的Windows 10 v1709 秋季更新里,Linux子系统的支持得到了相当大的改进,只需要2步就可以安装使用Linux子系统! 那么,在Windows 10秋季更新上安装Linux究竟有多简单呢? 那么,在Windows 10秋季更新上安装Linux究竟有多简单呢? 1. 启用 Windows Subsystem for Linux 由于控制面板被故意藏起来了,现在打开经典“添加删除程序”界面的最快方式是运行 appwiz.cpl 然后勾选“Windows Subsystem for Linux” 安装完后重启机器。 2. 在应用商店安装你需要的Linux版本 搜索"Linux"即可 目前在应用商店中的有3种Linux:Ubuntu 16.04及openSUSE的2个版本,这次我选择Ubun...

Windows Linux

Use ICMP Ping in .NET Core 2.0

In classic .NET Framework applications, we have used System.Net.NetworkInformation.Ping class to Ping a host address. This API is not included by default in .NET Core, even in version 2.0. Here is how to do it in a .NET Core way. First, we need to reference a package System.Net.Ping Install-Package System.Net.Ping This will give us the same API set as .NET Framework. Then, in your .NET Core...

.NET Core Ping ICMP

Use NLog in ASP.NET Core 2.0

Recently I am porting a classic ASP.NET MVC 5 project to .NET Core 2.0, in order to run it on Linux. One of the parts that has differences between .NET Fx and .NET Core is logging. I choose NLog as my logging providor, let's see how to port this to .NET Core. 1. Migrating Configuration File First, let's see the .NET Framework version of nlog.config.  This basic...

.NET Core NLog

Automatically Set Text Color on Accent Background in UWP

Windows 10 allows users to set accent color for the system, and in UWP apps, we usually honor those settings by using XAML pre-defined resource keys like {ThemeResource SystemControlBackgroundAccentBrush}. But regardless of how the user set default app mode to dark or light, when we apply text on accent colors, it may have some problems. For example, when the App is in light mode, the default...

XAML UWP

Get Client IP Address in ASP.NET Core 2.0

In classic ASP.NET we used to get client IP Address by Request.UserHostAddress. But this does not apply to ASP.NET Core 2.0. We need a different way to retrieve HTTP Request information. 1. Define a variable in your MVC controller private IHttpContextAccessor _accessor; 2.  DI into the controller's constructor public SomeController(IHttpContextAccessor accessor) { _accessor = accessor;...

ASP.NET .NET Core