Показать что-то кроме Все файлы в FileOpenPicker, который не отфильтрован, чтобы показать все файлы

Я показываю диалог открытия файла через Windows::Storage::Pickers::FileOpenPicker в проекте winrt, который я пишу. Когда я устанавливаю свойство FileTypeFilter в средстве выбора, оно работает, но отображаемое имя по-прежнему говорит: «Все файлы».

Я видел на docs.microsoft.com, что FileSavePicker имеет свойство FileTypeChoices, которое содержит карту вместо вектора, позволяющую средству выбора сохранения иметь имена для каждого типа, но я могу найти только вектор FileTypeFilter для средства выбора открытия файла. Даже на снимках экрана для примеров Microsoft написано «Все файлы», хотя они отфильтрованы.

Я знаю, что должен быть какой-то способ сделать это, потому что я видел множество программ со средствами выбора файлов, которые могут отображать имена.


Кто-нибудь знает, как заставить средство выбора открытых файлов показывать что-то другое, кроме всех файлов по умолчанию?

ПРИМЕЧАНИЕ. Я занимаюсь c++ уже несколько лет, но я все еще новичок в c++/winrt (например, только что узнал, что такое winrt ранее на этой неделе), поэтому я до сих пор не уверен, как это сделать. множество базовых вещей, например, правильная настройка средства выбора файлов

Это код, который создает и открывает диалог:

// Andrew Pratt 2021
// MainPage.cpp

#include "pch.h"
#include "MainPage.h"
#include "MainPage.g.cpp"

#include "winrt/Windows.Storage.h"
#include "winrt/Windows.Storage.Pickers.h"
#include "winrt/Windows.Storage.Pickers.Provider.h"

using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Popups;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::Storage;
using namespace Windows::Storage::Pickers;

namespace winrt::AltBrickUi::implementation
{
    MainPage::MainPage()
    {
        InitializeComponent();
    }
}


winrt::fire_and_forget winrt::AltBrickUi::implementation::MainPage::easyAlert(const IInspectable& title, const IInspectable& msg, const winrt::hstring& closeText)
{
    ContentDialog alert{ ContentDialog() };
    alert.Title(title);
    alert.Content(msg);
    alert.CloseButtonText(closeText);
    alert.ShowAsync();
    
    co_return;
}


void winrt::AltBrickUi::implementation::MainPage::MenuFlyoutItem_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e)
{
    showJsonFileOpenPicker();
}


winrt::fire_and_forget winrt::AltBrickUi::implementation::MainPage::showJsonFileOpenPicker()
{
    // Create file picker
    Pickers::FileOpenPicker picker{};
    picker.ViewMode(Pickers::PickerViewMode::List);
    picker.FileTypeFilter().ReplaceAll({ winrt::to_hstring(L".json") });
    // Open dialogue and get picked file
    StorageFile pickedFile = co_await picker.PickSingleFileAsync();

    if (pickedFile)
        easyAlert(winrt::box_value(L"File picked!"), winrt::box_value(pickedFile.DisplayName()), L"Cool");
    else
        easyAlert(winrt::box_value(L"Nothing Picked"), NULL, L"Alright");

    co_return;
}

Вот фрагмент того, как выглядит средство выбора файлов, когда я его запускаю:введите здесь описание изображения

Пример средства выбора файлов, которое отображается так, как мне нужно (это из Блокнота): введите здесь описание изображения


person Andrew Pratt    schedule 22.04.2021    source источник


Ответы (1)


Упомянутая вами ситуация всегда происходит в настольном приложении, таком как приложение wpf. прочитайте здесь, чтобы узнать больше.

Я должен сказать, что uwp не предоставляет такого API для этого. Если вам нужна эта функция, отправьте запрос на эту функцию в приложении Windows Feedback Hub.

person Arya Ding - MSFT    schedule 22.04.2021
comment
Да, похоже, что диалог.Фильтр смог это сделать. Я, вероятно, пойду в центр обратной связи, как вы сказали; тем временем, возможно, я могу найти обходной путь немного более низкого уровня, пока он не станет частью API. Спасибо! - person Andrew Pratt; 22.04.2021