Xaml 副作用:异步编程的文本框焦点问题

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

我已经为测试MQTT创建了一个WP8.1应用程序()

我已经基于应用程序的伟大工作完成的。谢谢

在使用MqttClient的连接功能时,我希望异步执行此操作。为此,我创建了此扩展:

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上发布整个应用程序,并准确指出我为缓解这个问题所做的更改?我担心在这里发布更多的代码片段并不能真正帮助创建清晰性。