首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >UWP FolderPicker窗口打开,但已冻结。

UWP FolderPicker窗口打开,但已冻结。
EN

Stack Overflow用户
提问于 2017-09-18 09:09:36
回答 1查看 252关注 0票数 1

基本思想是,我有一个UWP应用程序从本地保存的json文件中提取用户数据,它可以在不同的时候从文件中提取完整的对象列表,但是它总是检查用户是否设置了数据的位置,如果没有,则通过FolderPicker提示用户设置位置。在这种情况下,我有一个组合框,它可以帮助在选择标准和输入文本之后过滤对象。下面是调用堆栈:

加载UWPMiniatures.exe!UWPMiniatures.Data.MiniDAL.SetSaveFolder()第98行C#符号。加载UWPMiniatures.exe!UWPMiniatures.Data.MiniDAL.LoadAllAsync()第71行C#符号。加载UWPMiniatures.exe!UWPMiniatures.Data.MiniDataService.Load()第36行C#符号。( UWPMiniatures.exe!UWPMiniatures.MainPage.FilterGridView(string提交)第156个C#符号加载。UWPMiniatures.exe!UWPMiniatures.MainPage.SearchIcon_Click(object发送方,Windows.UI.Xaml.RoutedEventArgs e)第95行C#符号加载。

因此,在这里,FolderPicker被称为工作反向词:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private async Task SetSaveFolder()
{
    if(!StorageApplicationPermissions.FutureAccessList.ContainsItem("PickedFolderToken"))
    {
        FolderPicker folderPicker = new FolderPicker();
        folderPicker.SuggestedStartLocation = PickerLocationId.Desktop;
        folderPicker.FileTypeFilter.Add("*");
        folderPicker.CommitButtonText = "Pick A Folder To Save Your Data";
        StorageFolder folder = await folderPicker.PickSingleFolderAsync();
        if (folder != null)
        {
            // Application now has read/write access to all contents in the picked folder (including other sub-folder contents)
            StorageApplicationPermissions.FutureAccessList.AddOrReplace("PickedFolderToken", folder);
            var userFolder = await StorageApplicationPermissions.FutureAccessList.GetFolderAsync("PickedFolderToken");
            var file = await userFolder.CreateFileAsync("AllMinisList.json",CreationCollisionOption.OpenIfExists);
            var imagefolder = await userFolder.CreateFolderAsync("Images");
        }

    }
}

打开文件夹选择器对话框,在文件夹:旁边有一个闪烁的光标,但单击任何地方都不会发生任何情况,也不能键入文件夹: textbox。现在,将这个相同的代码放到一个新项目中,然后调用它来响应单击事件。对话框打开后,我会创建一个新文件夹或选择一个现有文件夹,它将被添加到未来的访问列表中。不知道如何解决这个问题,但问题似乎在于调用FolderPicker的实际代码。下面是另一个调用函数的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void SearchIcon_Click(object sender, RoutedEventArgs e)
{
    FilterGridView(SearchTextBox.Text);
    SearchTextBox.Text = "";
}

    private async void FilterGridView(string submission)
{
    var selected = FilterComboBox.SelectedValue;

    miniDS = new MiniDataService();  

   if(selected.ToString()=="All")
    {
        MiniList.Clear();
        List<Miniature> fullList = await miniDS.Load();
        fullList.ForEach(m => MiniList.Add(m));
    }
    else if (selected.ToString() == "Quantity")
    {
        List<Miniature> fullList = await miniDS.Load();
        var templist = fullList.AsQueryable()
         .Where($"{selected} = @0", submission); ;
        MiniList.Clear();
        templist.ToList<Miniature>()
            .ForEach(m => MiniList.Add(m));
    }
    else
    {
        List<Miniature> fullList = await miniDS.Load();
        var templist = fullList.AsQueryable()
        .Where($"{selected}.StartsWith(@0)", submission);
        MiniList.Clear();
        templist.ToList<Miniature>()
            .ForEach(m => MiniList.Add(m));
    }
}

MiniDataService和MiniDal在这里做的不多,只是传递了调用。有什么办法可以帮我解决这个问题吗?更新:一些附加信息,我将代码从SetSaveFolder()直接复制到一个按钮的新事件处理程序中,单击它,得到FolderPicker,功能完美。但这完全不是所需的功能。我需要直接或间接地从我的数据服务中调用它。所以这里是它创造的地方:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public sealed partial class MainPage : Page
    {
        /// <summary>
        /// MiniList is the list of minis currently being displayed
        /// </summary>
        private ObservableCollection<Miniature> MiniList;
        private MiniDataService miniDS;       
        private List<string> FilterComboList;
        private Miniature NewMini;

        public MainPage()
        {
            this.InitializeComponent();           
            miniDS = new MiniDataService();
            MiniList = new ObservableCollection<Miniature>();         
            FilterComboList = PopulateFilterCombo();
            NewMini = new Miniature();
            MyFrame.Navigate(typeof(MiniListPage), MiniList);
        }
...

因此,这个问题似乎与FolderPicker是从这个“静态”对象调用的事实有关。这是线程问题吗?我想,在UWP中,我总是在UI线程上,因为在顶层,一个事件处理程序正在调用folderPicker,我不明白为什么UI看起来被锁定了。

EN

回答 1

Stack Overflow用户

发布于 2017-09-19 08:26:18

所以我想我想明白了,虽然我不知道为什么会这样。如果有人能给我提示的话,我很感激。因此,从调用List<Miniature> fullList = await miniDS.Load();,这里有一个方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public async Task<List<Miniature>> Load()
        {
            return await minidal.LoadAllAsync();
        }

public async Task<List<Miniature>> LoadAllAsync()
        {

            List<Miniature> MiniCollection = new List<Miniature>();
            if (StorageApplicationPermissions.FutureAccessList.ContainsItem("PickedFolderToken"))
            {
                try
                {
                    var userFolder = await StorageApplicationPermissions.FutureAccessList.GetFolderAsync("PickedFolderToken");
                    var file = await userFolder.GetFileAsync("AllMinisList.json");
                    var data = await file.OpenReadAsync();

                    using (StreamReader stream = new StreamReader(data.AsStream()))
                    {
                        string text = stream.ReadToEnd();
                        MiniCollection = JsonConvert.DeserializeObject<List<Miniature>>(text);
                    }
                }
                catch(Exception e)
                {
                    throw e;
                }
            }
            else
            {
                SetSaveFolder().Wait();
                return MiniCollection;
            }

            return MiniCollection;
        }

所以问题就在这里:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SetSaveFolder().Wait();

当我用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await SetSaveFolder();

效果很好。我可以点击folderPicker,它可以做它应该做的事情。我想,虽然.Wait()是在您不返回其他任何内容时使用的,但是它似乎还有更多的东西!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46284807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文