我正在编写的 winrt 项目中通过 Windows::Storage::Pickers::FileOpenPicker 显示打开文件对话框。当我在选择器上设置 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;
}