2017-01-09 6 views
1

Я пишу приложение UWP на C# - это приложение Flashcard, в котором есть две InkCanvases для «передней» и «обратной» карт. Функциональность InkCanvas работает нормально. Проблема в том, что когда я перехожу к «сохранению» контейнера штриховки InkCanvas в файл .GIF (как это поддерживается в этих documents), генерируемые файлы .GIF не содержат чернил. Вместо этого они в основном пусты. Пример здесь:Сохранение Ink Canvas для потоковой обработки результатов в формате .GIF

Blank .GIF files

Может UWP разработчик помочь мне точку в правильном направлении? Вот код в его нынешнем виде:

CreateFlashCard.xaml.cs:

private void AddToDeck(object sender, RoutedEventArgs e) 
    { 
     // If there was ink on the canvases 
     if (inkCanvas.InkPresenter.StrokeContainer.GetStrokes().Count > 0 
      && inkCanvas2.InkPresenter.StrokeContainer.GetStrokes().Count > 0) 
     { 
      // Create the FlashCard and add it to the deck 
      FlashCard newCard = new FlashCard 
      { 
       Front = inkCanvas.InkPresenter, 
       Back = inkCanvas2.InkPresenter 
      }; 

      // Add to the deck 
      if (Deck == null) 
      { 
       Deck = new List<FlashCard>(); 
      } 
      // Now Add to the Deck 
      Deck.Add(newCard); 

      // Save the card 
      newCard.Save(_FolderName, Deck.Count-1); 

      // Now make way for new InkCanvases 
      inkCanvas.InkPresenter.StrokeContainer.Clear(); 
      inkCanvas2.InkPresenter.StrokeContainer.Clear(); 

     } 
     // The user is adding a new card without drawing on the old one 
     else 
     { 
      return; 
     } 


    } 

FlashCard.cs:

/// <summary> 
    /// Save the canvases to GIF files in the deck's folder. 
    /// </summary> 
    /// <param name="FolderName"> The folder to save the files in</param> 
    /// <param name="CardIndex">The "number" of the card that is being saved</param> 
    public async void Save(string FolderName, int CardIndex) 
    { 
     // Find existing folder 
     StorageFolder folder = await ApplicationData.Current.LocalFolder.GetFolderAsync(FolderName); 
     if (folder == null) 
     { 
      // Error! 
     } else 
     { 
      // Use a utility function to write to files 
      // Front and Back being InkPresenters from two sep. InkCanvases 
      WriteWithStream(folder, CardIndex, 'A', Front); 
      WriteWithStream(folder, CardIndex, 'B', Back); 

     } 

    } 

    private async void WriteWithStream(StorageFolder folder, int CardIndex, char Letter, InkPresenter FrontOrBack) 
    { 
     // Generate the ink files, A and B 
     StorageFile inkFile = await folder.CreateFileAsync("Card" + CardIndex + Letter + ".gif", CreationCollisionOption.ReplaceExisting); 
     // Prevent changes until we're done 
     //CachedFileManager.DeferUpdates(inkFile); 
     // Open a stream 
     IRandomAccessStream stream = await inkFile.OpenAsync(FileAccessMode.ReadWrite); 
     // Write out using the stream 
     using (IOutputStream outputStream = stream.GetOutputStreamAt(0)) 
     { 
      await FrontOrBack.StrokeContainer.SaveAsync(outputStream); 
      await outputStream.FlushAsync(); 
     } 
     // Dispose of the stream 
     stream.Dispose(); 
     // We are now done with the file 
     Windows.Storage.Provider.FileUpdateStatus status = await CachedFileManager.CompleteUpdatesAsync(inkFile); 
    } 

Спасибо всем!

ответ

0

Решенный - асинхронный характер моей функции «Сохранить» противоречил очистке холста - мне нужно было дождаться, когда будут созданы файлы, и ТОГДА очистит полотно.