如何在没有 FilePicker 的情况下在固定位置保存和加载 InkCanvas gif 文件
Posted
技术标签:
【中文标题】如何在没有 FilePicker 的情况下在固定位置保存和加载 InkCanvas gif 文件【英文标题】:How to save and load InkCanvas gif file at fixed location without FilePicker 【发布时间】:2018-09-25 22:55:05 【问题描述】:我想保存和加载没有FilePicker
的InkCanvas
gif
文件。
我看到sample 使用FilePicker
,但我想在单击保存按钮时自动保存gif
文件。
比如我保存1个InkCanvas
gif
文件时,
然后gif
文件保存在我的 C: 驱动器上的特定文件夹中。
我还希望文件名自动增长,以便我可以加载特定的InkCanvas
文件。
这可能吗?
【问题讨论】:
【参考方案1】:UWP 应用在沙盒中运行,因此用户可以知道应用在做什么以及它访问她硬盘上的哪些文件。
如果您想将文件保存到用户硬盘上的某个位置,您必须首先获得对该位置的访问权限。有几种方法可以实现这一点:
-
FileSavePicker - 您发现的选项,但它要求用户每次手动选择目标文件。如果您想在下次打开应用时访问选定的文件,可以utilize
FutureAccessList
,您可以将StorageFile
存储在一个键下,以便您下次再次检索。
FolderPicker - 让用户使用对话框选择应存储图像的文件夹,您将获得对该文件夹的读/写权限。然后,您可以根据需要轻松地在那里创建新文件。如果你想在下次打开应用时访问这个选定的位置,你可以utilize FutureAccessList
,在那里你可以将StorageFolder
存储在一个键下,这样你下次可以再次检索它。
Pictures library - 您的应用程序可以在 package.appxmanifest 文件中声明 picturesLibrary
功能,然后访问用户的图片库以进行如下编写:Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);
Broad file system access - 这是“终极”解决方案,需要您的应用以 Windows 10 的 Spring Creators Update(待定于 2018 年 4 月发布)或更高版本为目标。您必须在应用程序的清单中声明 broadFileSystemAccess
功能,然后您可以直接访问用户有权访问的任何文件系统路径。唯一的问题是您需要有充分的理由来执行此操作(例如构建文件浏览器应用程序或类似应用程序),因为在 Microsoft Store 认证期间会检查此功能,如果您的应用程序可能会被拒绝对于您要发布的应用程序类型而言,此功能的存在似乎是不必要的。
【讨论】:
您是否有任何消息来源可以说明“广泛的文件系统访问”功能是否需要单独的功能请求或权限在商店提交期间被授予? 虽然文档中没有直接说明,但在 UWP 社区站会和专门博客文章的注释中提到了它 - blogs.windows.com/buildingapps/2018/02/23/… 是的,我看到了那个站立。几天前,我提交了该功能的请求。我的请求仍在进行中,但 MS 家伙告诉我,我需要一个公司帐户来请求受限功能,并且我需要将我的所有应用程序移动到一个单独的公司帐户中。要求获得许可实在是太过分了。 这是一个临时问题 - 根据政策,您不需要需要拥有一个公司帐户才能使用此功能。我们会尽力解决这个问题抱歉。 @Kay 不,选项是“完整解决方案”,每个都是独立的,您不必将它们组合起来。如果您想完全避免选择器,解决方案 3 和 4 是合适的。如果您同意用户选择一个文件夹然后将所有图像保存在该文件夹中,您也可以使用解决方案 2【参考方案2】:我可以想象两种不同的情况可能会促使您提出这个问题:
-
应用程序出于某种原因需要存储文件,但用户不需要知道它。
您希望用户知道并能够访问该文件。
在第一种情况下,我想你并不关心你使用哪个路径,所以你可以使用存储应用程序数据的文件夹:
var selectedFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
第二种情况,你可以让用户选择一个路径,然后他每次点击“保存”按钮就可以自动保存图片:
private async void btnSelectFolder_Click(object sender, RoutedEventArgs e)
var picker = new FolderPicker();
picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Desktop;
picker.FileTypeFilter.Add("*");
selectedFolder = await picker.PickSingleFolderAsync();
TxbFolder.Text = selectedFolder.Path;
在 Save 按钮的 click 事件处理程序中,您仅更改检索文件的位置,其余部分保持在 example 中:
private async void btnSave_Click(object sender, RoutedEventArgs e)
// Get all strokes on the InkCanvas.
IReadOnlyList<InkStroke> currentStrokes = inkCanvas.InkPresenter.StrokeContainer.GetStrokes();
// Strokes present on ink canvas.
if (currentStrokes.Count > 0)
var file = await selectedFolder.CreateFileAsync("InkSample.gif", CreationCollisionOption.GenerateUniqueName);
if (file != null)
// The rest remains the same as in the example
// ...
以下是修改后的 XAML 代码和主页面构造函数:
private StorageFolder selectedFolder;
public MainPage()
this.InitializeComponent();
// Set supported inking device types.
inkCanvas.InkPresenter.InputDeviceTypes =
Windows.UI.Core.CoreInputDeviceTypes.Mouse |
Windows.UI.Core.CoreInputDeviceTypes.Pen;
// Listen for button click to initiate save.
btnSave.Click += btnSave_Click;
// Listen for button click to clear ink canvas.
btnClear.Click += btnClear_Click;
btnSelectFolder.Click += btnSelectFolder_Click;
selectedFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
TxbFolder.Text = selectedFolder.Path;
XAML
<Grid
Background="ThemeResource ApplicationPageBackgroundThemeBrush">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel x:Name="HeaderPanel" Orientation="Horizontal" Grid.Row="0">
<TextBlock x:Name="Header"
Text="Basic ink store sample"
Style="ThemeResource HeaderTextBlockStyle"
Margin="10,0,0,0" />
<TextBox x:Name="TxbFolder"
Text="Select a folder"
Width="250"
Margin="24,12,10,12"/>
<Button x:Name="btnSelectFolder"
Content="..."
Margin="0,0,10,0"/>
<Button x:Name="btnSave"
Content="Save"
Margin="24,0,10,0"/>
<Button x:Name="btnClear"
Content="Clear"
Margin="24,0,10,0"/>
</StackPanel>
<Grid Grid.Row="1">
<InkCanvas x:Name="inkCanvas" />
</Grid>
【讨论】:
以上是关于如何在没有 FilePicker 的情况下在固定位置保存和加载 InkCanvas gif 文件的主要内容,如果未能解决你的问题,请参考以下文章