После просмотра различных классов, связанных с ImageBrush, особенно класса BitmapImage, я начал думать, что свойство StreamSource просто ссылается на поток, а не делает локальную копию в объекте BitmapImage.Таким образом, оператор using в моем вспомогательном методе фактически освобождает поток и поэтому делает StreamSource объекта BitmapImage нулевым.Затем холст вернулся к белому (#FFFFFFFF) SolidColorBrush (спасибо Джеймсу за напоминание о Snoop ).
Итак, чтобы исправить это, я вместо этого создал приватный список для храненияссылки на различные потоки изображений, а затем указать мои BitmapImages на эти ссылки.Я реализовал IDisposable для выпуска различных MemoryStreams, когда появился GC.Вот сокращенный код:
public class Media : IDisposable
{
private readonly List<BitmapImage> m_Screens = new List<BitmapImage>();
private readonly List<MemoryStream> m_BackingStreams = new List<MemoryStream>();
public BitmapImage MainScreen { get; private set; }
public List<BitmapImage> Screens
{
get
{
return m_Screens;
}
}
public Media()
{
LoadScreens();
}
private void LoadScreens()
{
m_BackingStreams.Add(FromResourceBitmap(Properties.Resources.Screen_01));
m_BackingStreams.Add(FromResourceBitmap(Properties.Resources.Screen_02));
m_BackingStreams.Add(FromResourceBitmap(Properties.Resources.Screen_03));
m_BackingStreams.Add(FromResourceBitmap(Properties.Resources.Screen_04));
m_BackingStreams.Add(FromResourceBitmap(Properties.Resources.Screen_05));
foreach (var stream in m_BackingStreams)
{
m_Screens.Add(FromResourceStream(stream));
}
}
private BitmapImage FromResourceStream(Stream stream)
{
var result = new BitmapImage();
result.BeginInit();
result.StreamSource = stream;
result.EndInit();
return result;
}
private MemoryStream FromResourceBitmap(Bitmap bitmap)
{
var stream = new MemoryStream();
bitmap.Save(stream, ImageFormat.Png);
return stream;
}
public void Dispose()
{
if (m_BackingStreams.Count == 0 || m_BackingStreams == null) return;
foreach (var stream in m_BackingStreams)
{
stream.Close();
stream.Flush();
}
}
А вот как это выглядело, когда я на самом деле устанавливал фон моего Canvas во время выполнения:
MainMenuCanvas.Background = new ImageBrush(m_Media.Screens[0]);
Это исправило это, столь же изящно, какэто может быть.
Во время исследования я наткнулся на эту небольшую информацию на странице документации BitmapImage.StreamSource в MSDN:
Установите свойство CacheOption в BitmapCacheOption.OnLoad, если выхотите закрыть поток после создания BitmapImage.Параметр кэширования OnDemand по умолчанию сохраняет доступ к потоку до тех пор, пока не потребуется растровое изображение, а очистка выполняется сборщиком мусора.
(http://bit.ly/bitmapimagestreamsource)
Однако, когда я попытался использовать исходное решение с набором перечислений CacheOption для BitmapCacheOption.OnLoad, это привело к той же проблеме.Я могу что-то упустить здесь, но очевидное не так очевидно, я думаю.:)