Как сохранить и загрузить GIF-файл InkCanvas в фиксированном месте без FilePicker

Я хочу сохранить и загрузить файл InkCanvas gif без FilePicker.

Я видел пример используя FilePicker, но я хочу автоматически сохранять файл gif при нажатии кнопки сохранения.

Например, когда я сохраняю 1 файл InkCanvas gif,

Затем файл gif сохраняется в определенной папке на моем диске C:.

Я также хочу, чтобы имя файла увеличивалось автоматически, чтобы я мог загрузить определенный файл InkCanvas.

Это возможно?


person Kay    schedule 16.04.2018    source источник


Ответы (2)


Приложения UWP работают в изолированной программной среде, поэтому пользователь может знать, что делает приложение и к каким файлам на жестком диске оно обращается.

Если вы хотите сохранить файлы в место на жестком диске пользователя, вам сначала нужно будет предоставить доступ к этому местоположению. Есть несколько вариантов, как этого добиться:

  1. FileSavePicker - вариант, который вы обнаружили, но он требует, чтобы пользователь каждый раз вручную выбирал файл назначения. Если вы хотите получить доступ к выбранному файлу при следующем открытии приложения, вы можете используйте FutureAccessList, где вы можете сохранить StorageFile под ключом, что позволит вам получить его снова в следующий раз.
  2. FolderPicker — позвольте пользователю выбрать папку, в которой должны храниться изображения, с помощью диалогового окна, и вы получите разрешение на чтение/запись в эту папку. Затем вы можете легко создавать там новые файлы по мере необходимости. Если вы хотите получить доступ к этому выбранному местоположению при следующем открытии приложения, вы можете используйте FutureAccessList, где вы можете сохранить StorageFolder под ключом, что позволит вам получить его снова в следующий раз.
  3. Библиотека изображений — ваше приложение может объявить возможность picturesLibrary в файле package.appxmanifest, а затем получить доступ к библиотеке изображений пользователя, чтобы написать следующее: Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);
  4. Широкий доступ к файловой системе — это «наилучшее» решение, требующее, чтобы ваше приложение ориентировалось на Spring Creators. Обновление Windows 10 (ожидается выпуск в апреле 2018 г.) или более поздней версии. Вы должны объявить возможность broadFileSystemAccess в манифесте вашего приложения, а затем вы можете напрямую получить доступ к любому пути файловой системы, к которому у пользователя есть доступ. Единственная проблема заключается в том, что у вас должна быть веская причина для этого (например, создание приложения для просмотра файлов и т. п.), потому что эта возможность проверяется во время сертификации Microsoft Store, и вполне возможно, что ваше приложение будет отклонено, если наличие этой возможности кажется ненужным для публикуемого вами типа приложения.
person Martin Zikmund    schedule 16.04.2018
comment
Есть ли у вас какой-либо источник, который сообщает, требует ли возможность доступа к широкой файловой системе отдельного запроса возможности или разрешение предоставляется во время отправки в магазин? - person Mehrzad Chehraz; 16.04.2018
comment
Хотя это прямо не указано в документации, это было упомянуто в стендапе сообщества UWP и в примечаниях к специальной записи в блоге — blogs.windows.com/buildingapps/2018/02/23/ - person Martin Zikmund; 16.04.2018
comment
Если вы отправляете в Магазин приложение, в котором заявлена ​​эта возможность, вам потребуется предоставить дополнительные описания того, почему вашему приложению нужна эта мощная функция и как оно собирается ее использовать. - person Martin Zikmund; 16.04.2018
comment
Да, я видел этот стендап. Я отправил запрос на возможность несколько дней назад. Мой запрос все еще обрабатывается, но парень из MS сказал мне, что мне нужна учетная запись компании для запроса ограниченной возможности, и мне нужно переместить все мои приложения в отдельную учетную запись компании. Это слишком много, чтобы просить разрешения. - person Mehrzad Chehraz; 16.04.2018
comment
Так не должно быть, эта возможность должна быть разрешена для всех разработчиков :-O - person Martin Zikmund; 16.04.2018
comment
Теперь я могу подтвердить, что только учетные записи компаний могут запрашивать эту возможность. Забавно, как они говорят, что нам просто нужно сделать небольшую проверку, имеет ли это смысл для вашего приложения в стендапе, а затем они говорят что-то еще, когда вы запрашиваете это. - person Mehrzad Chehraz; 17.04.2018
comment
Это временная проблема — согласно политике вам НЕ нужно иметь корпоративную учетную запись для этой возможности. Мы постараемся исправить это на нашей стороне Извините. - person Peter Torr - MSFT; 18.04.2018
comment
@Kay Нет, варианты представляют собой полные решения, каждое из которых самодостаточно, вам не нужно их комбинировать. Если вы хотите вообще избежать сборщика, подойдут решения 3 и 4. Если вы согласны с тем, что пользователь выбирает папку, а затем сохраняет все изображения в этой папке, вы также можете использовать решение 2. - person Martin Zikmund; 18.04.2018
comment
Ни BroadFileSystemAccess, ни userDataSystem, ни даже runFullTrust не позволяют библиотекам .NET Standard получать доступ к файлам. Это полная ерунда, это делает UWP почти непригодным для широкого спектра приложений и библиотек и полностью нарушает совместимость со старым кодом. - person Aberro; 14.05.2020
comment
@Aberro, однако, это то же самое, что доступ к файлам по произвольным путям на Android. Хотя это может раздражать, это также хорошо для пользователей, так как приложение не загромождает жесткий диск. broadFilesystemAccess допускает дополнительные сценарии, но по-прежнему через посредников Windows.Storage API. - person Martin Zikmund; 15.05.2020
comment
@MartinZikmund, который не определен ни в .NET Standard, ни в .NET Core. - person Aberro; 16.05.2020
comment
Это тот же случай, что и с Android снова. Однако его можно абстрагировать через интерфейсы. В качестве альтернативы можно использовать многоцелевой таргетинг, чтобы упростить задачу. - person Martin Zikmund; 16.05.2020

Я могу представить два разных сценария, которые могут подтолкнуть вас к этому вопросу:

  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;
}

В обработчике события нажатия кнопки «Сохранить» вы меняете только место извлечения файла, остальное остается как в пример:

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>

person F. Renato    schedule 29.11.2019