如何在没有 FilePicker 的情况下在固定位置保存和加载 InkCanvas gif 文件
How to save and load InkCanvas gif file at fixed location without FilePicker
我想保存和加载 InkCanvas
gif
没有 FilePicker
的文件。
我看到 sample 使用 FilePicker
,但我想在单击保存按钮时自动保存 gif
文件。
例如,当我保存 1 InkCanvas
gif
个文件时,
然后 gif
文件保存在我的 C: 驱动器上的特定文件夹中。
我还希望文件名自动增长,以便我可以加载特定的 InkCanvas
文件。
这可能吗?
沙盒中的 UWP 应用程序 运行,这样用户就可以知道该应用程序在做什么以及它访问了硬盘驱动器上的哪些文件。
如果您想将文件保存到用户硬盘上的某个位置,您必须先获得该位置的访问权限。有几种方法可以实现这一点:
- FileSavePicker - the option you have discovered, but it requires the user to select the destination file each time manually. If you want to access the selected file next time the app is opened, you can utilize
FutureAccessList
,您可以将 StorageFile
存储在一个键下,这将允许您下次再次检索它。
- FolderPicker - let the user select the folder where the images should be stored using a dialog, and you will get read/write permission to this folder. You can then easily create new files there as you require. If you want to access this selected location next time the app is opened, you can utilize
FutureAccessList
,您可以将 StorageFolder
存储在一个键下,这将允许您下次再次检索它。
- Pictures library - 您的应用可以在 package.appxmanifest 文件中声明
picturesLibrary
功能,然后访问用户的图片库这样写:Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);
- Broad file system access - 这是 "ultimate" 解决方案,需要您的应用针对 Spring Creators Update of Windows 10(2018 年 4 月待发布)或更高版本.您必须在应用程序的清单中声明
broadFileSystemAccess
功能,然后您可以直接访问用户有权访问的任何文件系统路径。这样做的唯一问题是您需要有充分的理由才能这样做(例如构建文件资源管理器应用程序或类似应用程序),因为在 Microsoft Store 认证期间会检查此功能,如果您的应用程序可能会被拒绝对于您要发布的应用程序类型,此功能的存在似乎是不必要的。
我可以想象两种不同的场景可能会促使您提出这个问题:
- 应用程序出于某种原因需要存储文件,但用户不需要知道。
- 您希望用户知道并能够访问该文件。
在第一种情况下,我想你不关心你使用哪个路径,所以你可以使用存储应用程序数据的文件夹:
var selectedFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
第二种情况,可以让用户自己选择路径,每次点击"Save"按钮就可以自动保存图片:
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>
我想保存和加载 InkCanvas
gif
没有 FilePicker
的文件。
我看到 sample 使用 FilePicker
,但我想在单击保存按钮时自动保存 gif
文件。
例如,当我保存 1 InkCanvas
gif
个文件时,
然后 gif
文件保存在我的 C: 驱动器上的特定文件夹中。
我还希望文件名自动增长,以便我可以加载特定的 InkCanvas
文件。
这可能吗?
沙盒中的 UWP 应用程序 运行,这样用户就可以知道该应用程序在做什么以及它访问了硬盘驱动器上的哪些文件。
如果您想将文件保存到用户硬盘上的某个位置,您必须先获得该位置的访问权限。有几种方法可以实现这一点:
- FileSavePicker - the option you have discovered, but it requires the user to select the destination file each time manually. If you want to access the selected file next time the app is opened, you can utilize
FutureAccessList
,您可以将StorageFile
存储在一个键下,这将允许您下次再次检索它。 - FolderPicker - let the user select the folder where the images should be stored using a dialog, and you will get read/write permission to this folder. You can then easily create new files there as you require. If you want to access this selected location next time the app is opened, you can utilize
FutureAccessList
,您可以将StorageFolder
存储在一个键下,这将允许您下次再次检索它。 - Pictures library - 您的应用可以在 package.appxmanifest 文件中声明
picturesLibrary
功能,然后访问用户的图片库这样写:Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);
- Broad file system access - 这是 "ultimate" 解决方案,需要您的应用针对 Spring Creators Update of Windows 10(2018 年 4 月待发布)或更高版本.您必须在应用程序的清单中声明
broadFileSystemAccess
功能,然后您可以直接访问用户有权访问的任何文件系统路径。这样做的唯一问题是您需要有充分的理由才能这样做(例如构建文件资源管理器应用程序或类似应用程序),因为在 Microsoft Store 认证期间会检查此功能,如果您的应用程序可能会被拒绝对于您要发布的应用程序类型,此功能的存在似乎是不必要的。
我可以想象两种不同的场景可能会促使您提出这个问题:
- 应用程序出于某种原因需要存储文件,但用户不需要知道。
- 您希望用户知道并能够访问该文件。
在第一种情况下,我想你不关心你使用哪个路径,所以你可以使用存储应用程序数据的文件夹:
var selectedFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
第二种情况,可以让用户自己选择路径,每次点击"Save"按钮就可以自动保存图片:
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>