如何在没有 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 【问题描述】:

我想保存和加载没有FilePickerInkCanvas gif 文件。

我看到sample 使用FilePicker,但我想在单击保存按钮时自动保存gif 文件。

比如我保存1个InkCanvasgif文件时,

然后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 文件的主要内容,如果未能解决你的问题,请参考以下文章

固定ip

如何在不插入值的情况下在sql中创建动态行?

如何在没有添加的情况下在 Heroku 中启用堆栈跟踪

如何在没有中间目录的情况下在图库中编写视频?

如何在没有静态文本的情况下在 XCTest 中快速测试 Webview 是不是加载

如何在没有 IdlingResource 的情况下在 Espresso 中等待异步任务