我试图了解用于创建Metro风格应用程序的新Windows 8 Runtime .我知道你可以在XAML上使用它,它基于.NET,所以C#和VB.NET可以用来编写应用程序,但它似乎与HTML,CSS,DOM和JavaScript有关.
根据.NET UI程序员可以理解的术语,有人可以用几段解释它是什么吗?(我错过了理解它所必需的"关键".)
我们都知道WPF,Silverlight,Windows Forms等将至少在英特尔系统上继续在Windows 8(和Windows 10)下运行,所以请不要告诉我......
wpf windows-runtime windows-store-apps win-universal-app windows-10
前言:我正在寻找解释,而不仅仅是解决方案.我已经知道了解决方案.
尽管花了几天时间研究MSDN关于基于任务的异步模式(TAP),异步和等待的文章,但我仍然对一些更精细的细节感到困惑.
我正在为Windows Store应用程序编写一个记录器,我想支持异步和同步日志记录.异步方法遵循TAP,同步方法应该隐藏所有这些,并且看起来像普通方法一样工作.
这是异步日志记录的核心方法:
private async Task WriteToLogAsync(string text)
{
StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile file = await folder.CreateFileAsync("log.log",
CreationCollisionOption.OpenIfExists);
await FileIO.AppendTextAsync(file, text,
Windows.Storage.Streams.UnicodeEncoding.Utf8);
}
Run Code Online (Sandbox Code Playgroud)
现在相应的同步方法......
版本1:
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.Wait();
}
Run Code Online (Sandbox Code Playgroud)
这看起来是正确的,但它不起作用.整个程序永远冻结.
版本2:
嗯..也许任务没有开始?
private void WriteToLog(string text)
{
Task task = WriteToLogAsync(text);
task.Start();
task.Wait();
}
Run Code Online (Sandbox Code Playgroud)
这引发了 InvalidOperationException: Start may not be called on a promise-style task.
版本3:
嗯.. Task.RunSynchronously听起来很有希望.
private void WriteToLog(string text)
{
Task task = …Run Code Online (Sandbox Code Playgroud) .net c# task-parallel-library async-await windows-store-apps
所以,我正在尝试使用我拥有的pfx文件签署Windows 8 appx包.我正在使用这样的命令:
signtool.exe sign /fd sha256 /f "key.pfx" "app.appx"
Run Code Online (Sandbox Code Playgroud)
从此,我得到:
SignTool错误:未找到符合所有给定条件的证书.
我没有遇到什么"标准"?这仅用于测试,因此这些是自签名证书.我已经尝试导入密钥然后签名,但它总是会导致相同的错误.我该如何解决?
我有这个代码:
private async void ContextMenuForGroupRightTapped(object sender, RightTappedRoutedEventArgs args)
{
CheckBox ckbx = null;
if (sender is CheckBox)
{
ckbx = sender as CheckBox;
}
if (null == ckbx)
{
return;
}
string groupName = ckbx.Content.ToString();
var contextMenu = new PopupMenu();
// Add a command to edit the current Group
contextMenu.Commands.Add(new UICommand("Edit this Group", (contextMenuCmd) =>
{
Frame.Navigate(typeof(LocationGroupCreator), groupName);
}));
// Add a command to delete the current Group
contextMenu.Commands.Add(new UICommand("Delete this Group", (contextMenuCmd) =>
{
SQLiteUtils slu = new SQLiteUtils(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取HttpResponseMessage的内容.它应该是:{"message":"Action '' does not exist!","success":false}但我不知道如何从HttpResponseMessage中获取它.
HttpClient httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.GetAsync("http://****?action=");
txtBlock.Text = Convert.ToString(response); //wrong!
Run Code Online (Sandbox Code Playgroud)
在这种情况下,txtBlock将具有以下值:
StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Date: Wed, 10 Apr 2013 20:46:37 GMT
Server: Apache/2.2.16
Server: (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze14
Content-Length: 55
Content-Type: text/html
}
Run Code Online (Sandbox Code Playgroud) 在我的C#/ XAML metro应用程序中,有一个启动长时间运行过程的按钮.所以,按照建议,我使用async/await来确保UI线程不被阻止:
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
await GetResults();
}
private async Task GetResults()
{
// Do lot of complex stuff that takes a long time
// (e.g. contact some web services)
...
}
Run Code Online (Sandbox Code Playgroud)
偶尔,GetResults内发生的事情需要额外的用户输入才能继续.为简单起见,假设用户只需单击"继续"按钮即可.
我的问题是:如何以等待点击另一个按钮等事件的方式暂停GetResults的执行?
这是实现我正在寻找的东西的一种丑陋方式:"继续"按钮的事件处理程序设置了一个标志......
private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
_continue = true;
}
Run Code Online (Sandbox Code Playgroud)
...和GetResults定期轮询它:
buttonContinue.Visibility = Visibility.Visible;
while (!_continue) await Task.Delay(100); // poll _continue every 100ms
buttonContinue.Visibility = Visibility.Collapsed;
Run Code Online (Sandbox Code Playgroud)
民意调查显然非常糟糕(忙碌的等待/浪费周期),我正在寻找基于事件的东西.
有任何想法吗?
顺便说一下,在这个简化的例子中,一个解决方案当然是将GetResults()分成两部分,从开始按钮调用第一部分,从继续按钮调用第二部分.实际上,GetResults中发生的事情更复杂,并且在执行中的不同点可能需要不同类型的用户输入.因此,将逻辑分解为多种方法将是非常重要的.
我在Windows商店应用程序项目中实现了其他同事与Apiary.io的api.
他们展示了我必须实现的方法的这个例子
var baseAddress = new Uri("https://private-a8014-xxxxxx.apiary-mock.com/");
using (var httpClient = new HttpClient{ BaseAddress = baseAddress })
{
using (var response = await httpClient.GetAsync("user/list{?organizationId}"))
{
string responseData = await response.Content.ReadAsStringAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
在这个和其他一些方法中,我需要一个带有我之前获得的标记的标题
下面是一个邮递员(镀铬扩展)的图像,标题我正在谈论

如何将该授权标头添加到请求中?
c# windows-runtime dotnet-httpclient windows-store-apps apiary.io
.NET for Windows Store应用程序似乎不支持Thread.Sleep.
例如,这个
System.Threading.Thread.Sleep(1000);
Run Code Online (Sandbox Code Playgroud)
将在针对任何.NET Framework(2.0,3.5,4.0,4.5)进行编译时进行编译,但在针对Windows应用商店应用程序(或者同时针对4.5和存储的可移植类库)中进行编译时不会编译.
System.Threading.Thread仍然存在,它只是没有Sleep方法.
我需要在我的应用程序中延迟几秒钟,是否有合适的替代品?
编辑为什么需要延迟:我的应用程序是一个游戏,延迟是让它看起来像计算机对手正在"思考"他的下一步行动.该方法已被异步调用(主线程未被阻止),我只想减慢响应时间.
我正在构建一个Windows应用商店应用,我有一些代码需要发布到UI线程.
为此,我想检索CoreDispatcher并使用它来发布代码.
似乎有几种方法可以这样做:
// First way
Windows.ApplicationModel.Core.CoreApplication.GetCurrentView().CoreWindow.Dispatcher;
// Second way
Window.Current.Dispatcher;
Run Code Online (Sandbox Code Playgroud)
我想知道哪一个是正确的?或两者是否相同?
c# dispatcher async-await windows-runtime windows-store-apps
当我尝试调试我的Windows 8应用程序并且已经在另一个用户帐户上安装了一个副本时,我一直在遇到这个问题:
DEP0700:应用程序注册失败.另一位用户已经安装了此应用程序的打包版本.未打包的版本无法取代此版本.冲突的包是{{{PackageName}}},它由CN = {{{Certificate Stuff}}}发布.(0x80073cf9)
有时我可以登录或要求其他人登录计算机并卸载应用程序.或者,我可以更改应用程序名称/ ID,但是一个并不总是可行而另一个是有风险的(我不想将已更改的应用程序ID签入源代码控制).
必须有一些方法来卸载它.也许是PowerShell脚本?
powershell windows-8 windows-runtime windows-store windows-store-apps
c# ×7
async-await ×4
windows-8 ×3
.net ×2
.net-4.5 ×1
apiary.io ×1
appx ×1
dispatcher ×1
lambda ×1
powershell ×1
resharper ×1
signtool ×1
windows-10 ×1
wpf ×1