Показать визуализированное изображение UIelement (Visual) в элементе управления изображением WPF

Я разрабатываю приложение и хотел бы реализовать функцию, аналогичную системе подкачки Microsoft Power Point, где сбоку отображается уменьшенное изображение листов, над которыми вы работаете.

У меня есть следующая функция, которая отображает изображение сетки, в которой должен работать пользователь.

private void CreateImageOfPage()
    {
        int width = (int)this.WorkSheetViewModelList.Last().RootGrid.Width;
        int height = (int)this.WorkSheetViewModelList.Last().RootGrid.Height;
        RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
        renderTargetBitmap.Render(this.WorkSheetViewModelList.Last().RootGrid);
        PngBitmapEncoder pngImage = new PngBitmapEncoder();
        pngImage.Frames.Add(BitmapFrame.Create(renderTargetBitmap));

        JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
        Guid photoID = System.Guid.NewGuid();

        String photolocation = "Temp/"+photoID.ToString() + ".png";
        using (var filestream = new FileStream(photolocation, FileMode.Create))
            encoder.Save(filestream);
        Console.WriteLine(Path.GetFullPath(photoID.ToString() + ".png"));
    }

Мой вопрос: как получить, установить или отформатировать путь к сохраненному изображению, который будет установлен в качестве источника изображения в XAML? В его текущем виде путь выглядит так: «D:\Project\bin\Debug\7fd77420-f62e-44e7-b206-b5ce19f01a9e.png», и он говорит, что не может получить файл в этом месте (пока я просто скопировал вывод, но он будет связан, как и должно быть).

Если путь, который я выбрал, не элегантен, есть ли другой способ сделать это лучше или вообще без сохранения образа на диск?

Спасибо!


person Kocsis Elod    schedule 02.05.2018    source источник


Ответы (1)


Вам не нужно делать какую-либо кодировку изображения.

Предполагая, что существует элемент Image с именем image, вы можете напрямую назначить RenderTargetBitmap его свойству Source следующим образом:

image.Source = renderTargetBitmap;

Вы можете изменить свой метод на это:

private ImageSource CreateImageOfPage()
{
    var rootGrid = WorkSheetViewModelList.Last().RootGrid;
    var width = (int)rootGrid.ActualWidth;
    var height = (int)rootGrid.ActualHeight;
    var renderTargetBitmap = new RenderTargetBitmap(
        width, height, 96, 96, PixelFormats.Pbgra32);
    renderTargetBitmap.Render(rootGrid);
    return renderTargetBitmap;
}

и используйте его так:

image.Source = CreateImageOfPage();
person Clemens    schedule 02.05.2018
comment
Спасибо за ваш ответ. Я попытался собрать кусочки вместе, и кажется, что созданные изображения не появляются. В файле XAML у меня есть следующее: ‹Image Grid.Row=1 Stretch=Fill Source={Binding Source, Mode=TwoWay} Width=60 Height=80 VerticalAlignment=Top Visibility=Visible› Я присвоил возвращенное значение свойство Source (общедоступный источник ImageSource). - person Kocsis Elod; 02.05.2018
comment
Вы привязали свойство Source изображения к свойству Source в своей модели представления (где Mode=TwoWay не имеет смысла). Уведомляет ли свойство модели представления об изменении значения, например. путем запуска события PropertyChanged интерфейса INotifyPropertyChanged? - person Clemens; 02.05.2018
comment
Да. Вот он: private ImageSource _source; общедоступный источник ImageSource { получить { return this._source; } установить { this._source = значение; this.RaisePropertyChanged(); } } Метод RaisePropertyChanged является частью класса, реализующего интерфейс INotifyPropertyChanged. Для других свойств это работает хорошо. - person Kocsis Elod; 02.05.2018
comment
Это должно сработать. Попробуйте использовать ActualWidth и ActualHeight RootGrid вместо ширины и высоты, как показано в отредактированном ответе. - person Clemens; 02.05.2018
comment
Я изменил его, и все равно ничего, он не появляется. - person Kocsis Elod; 02.05.2018
comment
Работает ли это, если вы назначаете свойство Source любому другому изображению, например. один создан из существующего пути к файлу изображения, например. Source = new BitmapImage(new Uri(filePath));? - person Clemens; 02.05.2018
comment
Это, безусловно, выходит за рамки вашего первоначального вопроса, но вы, возможно, забыли назначить DataContext Window экземпляру вашей модели представления, чтобы Binding не имел исходного объекта. - person Clemens; 03.05.2018
comment
Ты был прав. Я забыл установить контекст данных. Тем не менее, установив его, теперь он отображает изображение, которое находится на жестком диске, но ничего не делает, когда оно привязано. - person Kocsis Elod; 03.05.2018
comment
Что это обозначает? Если вы загрузите BitmapImage из файла и назначите его свойству view model Source, это сработает? Но не с ImageSource, возвращенным из вашего метода? - person Clemens; 03.05.2018