在加载数据之前在页面上加载屏幕

Loading screen on page before data are loaded

我有一个带有加载动画的网格的页面。

我需要做的是从加密文件加载数据并在该页面上用它填充文本框。 当它被加密时,它当然需要一些时间来加载。这就是我创建加载动画的原因。

我创建了异步加载数据的函数,这样我就可以显示加载屏幕,加载后我就隐藏它。

看起来像这样:

public ArtaSettingsPage()
    {

        InitializeComponent();
        VpnSettingsSavedLabel.Visibility = Visibility.Hidden;
        LoadDataAsync();

        async void LoadDataAsync()
        {
            await Task.Run(
            () =>
            {
                var info = FileCryptoDecryptor.ReadEncryptedConfiguration("hakuna.xml.aes", Global_Variables.AppPassword);
                string ArtaVPNIPSecKey = info.ArtaIPSECKey;
                string ArtaVPNServer = info.ArtaVPNServer;
                string ArtaVPNUsername = info.ArtaVPNUser;
                string ArtaVPNPass = info.ArtaVPNPass;
                string ArtaLocalAdminPass = info.ArtaLocalAdminPass;
                string ArtaDomainAccUser = info.ArtaDomainAccUser;
                string ArtaDomainAccPass = info.ArtaDomainAccPass;

                string DecryptedArtaVPNIPSecKey = EncryDecryptor.Decrypt(ArtaVPNIPSecKey, "password");
                string DecryptedArtaVPNServer = EncryDecryptor.Decrypt(ArtaVPNServer, "password");
                string DecryptedArtaVPNUsername = EncryDecryptor.Decrypt(ArtaVPNUsername, "password");
                string DecryptedArtaVPNPass = EncryDecryptor.Decrypt(ArtaVPNPass, "password");
                string DecryptedArtaLocalAdminPass = EncryDecryptor.Decrypt(ArtaLocalAdminPass, "password");
                string DecryptedArtaDomainAccUser = EncryDecryptor.Decrypt(ArtaDomainAccUser, "password");
                string DecryptedArtaDomainAccPass = EncryDecryptor.Decrypt(ArtaDomainAccPass, "password");

                DCIPBox.Text = info.ArtaDCIP;
                VPNServerTextBox.Text = DecryptedArtaVPNServer;
                ArtaIPSecKeyPasswordBox.Password = DecryptedArtaVPNIPSecKey;
                ArtaVPNUsernameBox.Text = DecryptedArtaVPNUsername;
                ArtaVPNPasswordBox.Password = DecryptedArtaVPNPass;
                ArtaLocalAdminPassBox.Password = DecryptedArtaLocalAdminPass;
                DomainAccUsernameTextbox.Text = DecryptedArtaDomainAccUser;
                DomainAccPassTextbox.Password = DecryptedArtaDomainAccPass;
                DomainTextbox.Text = info.ArtaDomain;
            });
        }

问题是当我调用它时,我在DCIPBox.Text = info.ArtaDCIP;用解密数据填充文本框的那一行出现异常。

"Calling thread have no acces to object because its owned by another thread".

我想问题是当我使用 await 时它会创建另一个线程来完成工作如果我做对了并且我页面上的文本框之类的对象在不同的​​ "main" 线程上。

还有其他选择吗?

//编辑

一个想法是在解密后不异步填充文本框,但我只是好奇是否有可能异步填充它们并向用户显示已填充信息的页面。

找到解决方案:

您可以像这样使用调度程序调用来更新来自不同线程的对象:

DCIPBox.Dispatcher.BeginInvoke((Action)(() => DCIPBox.Text = info.ArtaDCIP));