Uwp 如何在没有文件选择器的情况下在固定位置保存和加载InkCanvas gif文件

Uwp 如何在没有文件选择器的情况下在固定位置保存和加载InkCanvas gif文件,uwp,gif,inkcanvas,filepicker,Uwp,Gif,Inkcanvas,Filepicker,我想保存并加载InkCanvasgif文件,而不使用文件选择器 我看到一个正在使用FilePicker,但我想在单击save按钮时自动保存gif文件 例如,当我保存1InkCanvasgif文件时 然后,gif文件将保存在我的C:驱动器上的特定文件夹中 我还希望文件名自动增长,以便可以加载特定的InkCanvas文件 这可能吗?UWP应用程序在沙箱中运行,这样用户就可以知道应用程序在做什么以及它访问硬盘上的哪些文件 如果您想将文件保存到用户硬盘上的某个位置,则必须首先授予您访问该位置的权限。有几

我想保存并加载
InkCanvas
gif
文件,而不使用
文件选择器

我看到一个正在使用
FilePicker
,但我想在单击save按钮时自动保存
gif
文件

例如,当我保存1
InkCanvas
gif
文件时

然后,
gif
文件将保存在我的C:驱动器上的特定文件夹中

我还希望文件名自动增长,以便可以加载特定的
InkCanvas
文件


这可能吗?

UWP应用程序在沙箱中运行,这样用户就可以知道应用程序在做什么以及它访问硬盘上的哪些文件

如果您想将文件保存到用户硬盘上的某个位置,则必须首先授予您访问该位置的权限。有几种方法可以实现这一点:

  • -您发现的选项,但它要求用户每次手动选择目标文件。如果您想在下次打开应用程序时访问所选文件,您可以,在这里您可以将
    StorageFile
    存储在一个键下,这将允许您下次再次检索它
  • -让用户使用对话框选择存储图像的文件夹,您将获得该文件夹的读/写权限。然后,您可以根据需要在那里轻松创建新文件。如果您想在下次打开应用程序时访问此选定位置,您可以在其中将
    StorageFolder
    存储在一个键下,以便下次再次检索
  • -您的应用程序可以在package.appxmanifest文件中声明
    picturesLibrary
    功能,然后访问用户的图片库进行如下写入:
    Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.pictures)
  • -这是“终极”解决方案,要求您的应用程序以Windows 10的Spring Creators更新(2018年4月发布)或更高版本为目标。您必须在应用程序清单中声明
    broadFileSystemAccess
    功能,然后您可以直接访问用户有权访问的任何文件系统路径。唯一的问题是,你需要有一个很好的理由来这样做(比如构建一个文件浏览器应用程序,或者类似的),因为此功能是在Microsoft Store认证期间检查的,如果您发布的应用程序类型似乎不需要此功能,则您的应用程序可能会被拒绝

  • 我可以想象两种不同的情况会让你陷入这个问题:

  • 由于某种原因,应用程序需要存储文件,但用户不需要知道
  • 您希望用户知道并能够访问该文件
  • 在第一个场景中,我假设您不在乎使用哪条路径,因此可以使用存储应用程序数据的文件夹:

    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;
    }
    
    在“保存”按钮的“单击”事件处理程序中,您只更改检索文件的位置,其余的保持如下所示:

    XAML

    
    

    您是否有任何来源可以告诉我们“广泛的文件系统访问”功能是否需要单独的功能请求,或者在商店提交过程中许可是否被拒绝?虽然文档中没有直接说明,但UWP社区站和专用博客帖子的注释中都提到了这一点-是的,我看到了这一站。几天前,我提交了一份能力申请。我的请求仍在进行中,但盖伊女士告诉我,我需要一个公司帐户来请求受限功能,我需要将我的所有应用程序移动到一个单独的公司帐户中。这是一个暂时性的问题——根据政策,你不需要有一个公司帐户来拥有这种能力。我们会尽力在我们这边解决这个问题。对不起。@Kay不,选项是“完整解决方案”,每个都是独立的,您不必组合它们。如果您想完全避免选取器,解决方案3和4是合适的。如果您同意用户选择一个文件夹,然后保存该文件夹中的所有图像,您也可以使用解决方案2
    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
                 // ...
             }
          }
    }
    
    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;
    }
    
    <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>