2015-11-24 5 views
0

У меня есть окно:Все изображения в XPS выглядят одинаково при загрузке из массива байтов

<Window x:Class="WpfTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Width="150" Height="100" 
     MouseLeftButtonDown="OnClick"> 
    <StackPanel Orientation="Horizontal"> 
     <Image Source="{Binding Image1}" /> 
     <Image Source="{Binding Image2}" /> 
    </StackPanel> 
</Window> 

отделенного кода:

public partial class MainWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new 
     { 
      Image1 = Convert.FromBase64String("iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAKhJREFUWIXtltEJgzAURU+l7Qg6S+kiHaOLdBL9EgKlEzhTUrA/fkgM+Ah5FeUdCAmSvHvUEAKGsaQBHOCBsVALU81GIuAKBsfNxWGnhIAHLhLTDAJwXRMYlcKTmZVy2CrnzHUvYIie3YHnvwQGoCtRa7e/oJ2NUxtZzOZfwARMwARMIPcknPOY+lvOYrsPpAS+inlBIvBRFHhLJmlcyz3QA3WxVzEOww83D06TNQuS8AAAAABJRU5ErkJggg=="), 
      Image2 = Convert.FromBase64String("iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAPFJREFUWIXtlksKwjAURY9iBQcORLArcOAanLsChQ7dggtwU0JBBKduxIF7aAt1YJy0iUnz8UcuPGhKbt55r2kIREW1lQI5UAC1pyjFmqkJQO4xcTPyZrKeBKAAEhNSC5XAUAdQB0ouzdkPnEyrgYVno1hnBWyRd7WTdBvplfaOfmeAyTsAZLG2LeAnNyHADbgAlRhf/eA8pGvhERgpvAsDvzPAXOEbA+euADYn4dOzBHbiORHjqcarytkCMKkgM5j7/X+ByydQqZP/4x2wOQcynwDxPiADqCTvfKk0ATgFBDiaTApxLS+AAzDzVkrU3+gOjt+/W2ggWToAAAAASUVORK5CYII="), 
     }; 
    } 

    private void OnClick(object sender, MouseButtonEventArgs e) 
    { 
     using (var xps = new XpsDocument(@"1.xps", FileAccess.Write)) 
      XpsDocument.CreateXpsDocumentWriter(xps).Write((Visual)this.Content); 
    } 
} 

Как вы можете видеть, он отображает два изображения и записывается XPS-файл при щелчке мыши.

Это то, что я вижу на экране:

Это то, что я получаю в XPS:

Таким образом, первое изображение отображается вместо второго один. На самом деле, если у меня есть несколько изображений, все они заменяются первым в полученном XPS.

Однако, если вместо byte[] Я установил источник изображения в URL-адрес файла, тогда XPS правильно отобразит все изображения.

Что происходит?

ответ

2

Исследование показывает, что, когда Image.Source присваивается массив байт, ImageSourceConverter класса используется WPF для преобразования массива в соответствующей ImageSource. BitmapFrame.Create() вызывается внутри для выполнения фактической загрузки растрового изображения. Так что этот код абсолютно тот же эффект:

var view = new StackPanel 
{ 
    Orientation = Orientation.Horizontal, 
    Children = 
    { 
     new Image { Source = BitmapFrame.Create(new MemoryStream(pic1Bytes), BitmapCreateOptions.None, BitmapCacheOption.Default) }, 
     new Image { Source = BitmapFrame.Create(new MemoryStream(pic2Bytes), BitmapCreateOptions.None, BitmapCacheOption.Default) }, 
    } 
}; 
using (var xps = new XpsDocument(@"1.xps", FileAccess.Write)) 
    XpsDocument.CreateXpsDocumentWriter(xps).Write(view); 

Однако, если я загружаю изображение, используя BitmapImage класс, проблема больше не существует. Этот код работает как на экране, так и в XPS:

private static BitmapSource ImageFromBytes(byte[] bytes) 
{ 
    var bmp = new BitmapImage(); 
    using (var stream = new MemoryStream(bytes)) 
    { 
     bmp.BeginInit(); 
     bmp.CacheOption = BitmapCacheOption.OnLoad; 
     bmp.StreamSource = stream; 
     bmp.EndInit(); 
    } 
    return bmp; 
} 

// usage example: 
new Image { Source = ImageFromBytes(picBytes) } 

Это, вероятно, ошибка в ImageSourceConverter. Для продолжения использования привязки XAML можно создать собственный конвертер, используя ImageFromBytes.

+0

Это не может быть ошибкой в ​​ImageSourceConverter. Я могу успешно привязать два элемента управления Image к двум различным свойствам 'byte []' изображения в модели представления (без какого-либо явного преобразования). В вашем приложении должно быть что-то еще. – Clemens

+0

Это не «мое приложение». Минимальный код из вопроса воспроизводит ошибку, попробуйте сами. – torvin

+0

Я сделал это уже с двумя элементами управления изображением, связанными с двумя свойствами модели представления типа 'byte []'. Эта настройка использует неявное преобразование, предоставляемое классом ImageSourceConverter. Нет ошибки, хотя ... – Clemens