2017-01-14 2 views
0

У меня есть DrawingImage, который использует DynamicResources для своих цветов. Я хочу использовать этот образ в анимации, однако вы не можете использовать объекты, которые используют DynamicResources в анимации, потому что они не являются Freezable. Я знаю, что у меня не может быть, чтобы его цвета динамически менялись во время анимации, меня это не волнует. Я просто хочу создать версию этого изображения, которую я могу использовать в анимации. Таким образом, в основном, изображение оценивает все его ресурсы, а затем выплевывает версию, которую я могу вызвать Freeze для использования в анимации. Неужели это должно быть возможно? Должен ли я, например, записать этот образ на диск? Это должно создать версию Freezable, нет? Я googled и искал StackOverflow, но не могу найти ничего полезного ... Любая помощь была бы высоко оценена.Создать Freezable изображение с не-Freezable image

+0

Вы попробовали метод 'GetAsFrozen()'? – Clemens

+0

Да, но это работает только в том случае, если значение параметра CanFreeze истинно, а это не связано с DynamicResources. – StuartMorgan

ответ

0

Это было удивительно сложно выкопать решение, но я, кажется, нашел его. Я сделал это удобное расширение, которое возьмет мой DrawingImage и закодирует его как PNG через PngBitmapEncoder, а затем напишет это в поток памяти, а затем загрузите его в BitmapImage, который является Freezable и может использоваться в моей анимации. Вся лотта работает на что-то такое простое!

public static class DrawingExtensions 
{ 
    public static BitmapImage GetAsFreezableBitmapImage(this DrawingImage drawingImage) 
    { 
     return drawingImage?.Drawing?.GetAsFreezableBitmapImage(); 
    } 

    public static BitmapImage GetAsFreezableBitmapImage(this Drawing drawing) 
    { 
     if (drawing == null) 
      return null; 

     var drawingVisual = new DrawingVisual(); 

     using (var drawingContext = drawingVisual.RenderOpen()) 
     { 
      drawingContext.PushTransform(new TranslateTransform(-drawing.Bounds.X, -drawing.Bounds.Y)); 
      drawingContext.DrawDrawing(drawing); 
     } 

     var bitmap = new RenderTargetBitmap((int)drawing.Bounds.Width, (int)drawing.Bounds.Height, 96, 96, PixelFormats.Pbgra32); 
     bitmap.Render(drawingVisual); 

     var encoder = new PngBitmapEncoder(); 
     encoder.Frames.Add(BitmapFrame.Create(bitmap)); 

     var bitmapImage = new BitmapImage(); 
     using (var stream = new MemoryStream()) 
     { 
      encoder.Save(stream); 
      bitmapImage.BeginInit(); 
      bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
      bitmapImage.StreamSource = stream; 
      bitmapImage.DecodePixelHeight = bitmap.PixelHeight; 
      bitmapImage.DecodePixelWidth = bitmap.PixelWidth; 
      bitmapImage.EndInit(); 
     } 

     return bitmapImage; 
    } 
} 
Смежные вопросы