代码之家  ›  专栏  ›  技术社区  ›  Kay

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

  •  2
  • Kay  · 技术社区  · 6 年前

    我要保存并加载 InkCanvas gif 不带的文件 FilePicker

    我看到一个 sample 使用 文件选择器 ,但我想保存 gif格式 单击“保存”按钮时自动创建文件。

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

    然后 gif格式 文件保存在C:驱动器上的特定文件夹中。

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

    这可能吗?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Martin Zikmund    6 年前

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

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

    1. FileSavePicker -您发现的选项,但它要求用户每次手动选择目标文件。如果您想在下次打开应用程序时访问选定的文件,您可以 utilize FutureAccessList ,您可以在其中存储 StorageFile 在一个键下,这将允许您下次再次检索它。
    2. FolderPicker -让用户使用对话框选择存储图像的文件夹,您将获得该文件夹的读/写权限。然后,您可以根据需要在那里轻松创建新文件。如果您想在下次打开应用程序时访问此选定位置,您可以 使用 未来访问列表 ,您可以在其中存储 StorageFolder 在一个键下,这将允许您下次再次检索它。
    3. Pictures library -您的应用程序可以声明 picturesLibrary 中的功能 包裹appxmanifest公司 文件,然后访问用户的图片库以进行如下书写: Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);
    4. Broad file system access -这是“终极”解决方案,要求您的应用程序针对Windows 10的Spring Creators更新(2018年4月即将发布)或更高版本。您必须声明 broadFileSystemAccess 功能,然后您可以直接访问用户有权访问的任何文件系统路径。唯一的问题是,您需要有一个很好的理由来执行此操作(例如构建文件浏览器应用程序或类似操作),因为此功能是在Microsoft Store认证期间检查的,如果您发布的应用程序类型似乎不需要此功能,则您的应用程序可能会被拒绝。
        2
  •  0
  •   F. Renato    5 年前

    我可以想象两种不同的情况会把你推向这个问题:

    1. 由于某种原因,应用程序需要存储文件,但用户不需要知道它。
    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;
    }
    

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