Xaml 副作用:异步编程的文本框焦点问题
我已经为测试MQTT创建了一个WP8.1应用程序() 我已经基于应用程序的伟大工作完成的。谢谢 在使用MqttClient的连接功能时,我希望异步执行此操作。为此,我创建了此扩展:Xaml 副作用:异步编程的文本框焦点问题,xaml,asynchronous,windows-runtime,mqtt,Xaml,Asynchronous,Windows Runtime,Mqtt,我已经为测试MQTT创建了一个WP8.1应用程序() 我已经基于应用程序的伟大工作完成的。谢谢 在使用MqttClient的连接功能时,我希望异步执行此操作。为此,我创建了此扩展: public static class MqttClientEx { public static async Task<byte> ConnectAsync(this MqttClient client, string clientId, string user
public static class MqttClientEx
{
public static async Task<byte> ConnectAsync(this MqttClient client,
string clientId,
string username,
string password,
bool cleanSession,
ushort keepAlivePeriod,
bool willRetain = false,
byte willQosLevel = 0,
bool willFlag = false,
string willTopic = "",
string willMessage = "")
{
var t = Task.Run(() =>
{
return client.Connect(
clientId: clientId,
username: username,
password: password,
willRetain: willRetain,
willQosLevel: willQosLevel,
willFlag: willFlag,
willTopic: willTopic,
willMessage: willMessage,
cleanSession: cleanSession,
keepAlivePeriod: keepAlivePeriod);
});
return await t;
}
}
公共静态类MqttClientEx
{
公共静态异步任务ConnectAsync(此MqttClient客户端,
字符串clientId,
字符串用户名,
字符串密码,
布尔,
ushort keepAlivePeriod,
bool willRetain=false,
字节willQosLevel=0,
bool-willFlag=false,
字符串willTopic=“”,
字符串willMessage=“”)
{
var t=Task.Run(()=>
{
返回客户端。连接(
clientId:clientId,
用户名:用户名,
密码:密码,
willRetain:willRetain,
willQosLevel:willQosLevel,
willFlag:willFlag,
willTopic:willTopic,
willMessage:willMessage,
净化:净化,
keepAlivePeriod:keepAlivePeriod);
});
返回等待t;
}
}
这确保了UI线程即使在MQTT Connect需要一段时间的情况下也能响应。它还确保当用户键入错误的mqtt代理地址或代理不可用时,UI线程不会锁定
它是有效的,但它也带来了一个副作用,我不理解,也无法缓解:
当我按下订阅按钮(UI的一部分)时,broker文本框获得焦点?!为什么,我不知道
这非常烦人,因为每次按下Subscribe按钮时,屏幕上的键盘都会出现并覆盖输出窗口,要将其移除,用户需要再次按下UI上的其他位置以解除文本框的焦点
这似乎是由于引入了wait Task.Run(()=>…导致的。如果我同步调用MqttClient.Connect,则文本框不会获得焦点
如果您有任何建议,我们将不胜感激。您能展示调用ConnectAsync的代码以及相关的XAML吗?谢谢您的提问。结果证明这相当棘手,我仍然不明白为什么我会看到这种行为,因此我无法真正解释它。无论如何,我找到了解决方法。如果您仍想查看,我会的很高兴明天在Github上发布整个应用程序,并准确指出我为缓解这个问题所做的更改?我担心在这里发布更多的代码片段并不能真正帮助创建清晰性。