2017-01-09 8 views
1

私はUWPアプリをC#で書いています。カードの「前」と「後」の2つのインクキャンバスを備えたFlashcardアプリケーションになります。 InkCanvas機能は正常に動作しているようです。問題は、InkCanvasのストロークコンテナを.GIFファイル(これらのファイルでサポートされているように)に「保存」すると、生成された.GIFファイルにインクが含まれていないことです。代わりに、ほとんど空白です。ここでは例:インクキャンバスを保存して空白にする.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

解決済み - 私の "保存機能"の非同期性がキャンバスのクリアと競合していました - ファイルが生成されるのを待つ必要があり、キャンバスをクリアする必要がありました。

関連する問題