Язык

RenderTargetBitmap Класс

Определение

Представляет источник изображения, который можно заполнить объединенным содержимым визуального дерева XAML. Сведения о некоторых важных ограничениях, в которых визуальные элементы XAML можно записать в renderTargetBitmap.

public ref class RenderTargetBitmap sealed : ImageSource
/// [Windows.Foundation.Metadata.Activatable(65536, "Microsoft.UI.Xaml.WinUIContract")]
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class RenderTargetBitmap final : ImageSource
[Windows.Foundation.Metadata.Activatable(65536, "Microsoft.UI.Xaml.WinUIContract")]
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class RenderTargetBitmap : ImageSource
Public NotInheritable Class RenderTargetBitmap
Inherits ImageSource
Наследование
Object Platform::Object IInspectable DependencyObject ImageSource RenderTargetBitmap
Атрибуты

Примеры

Эта базовая структура кода адаптирована из первого сценария XAML и кода отрисовки XAML в образце растрового изображения. Обратите внимание, что весь код, даже конструктор, находится в асинхронном методе. Здесь это обработчик событий для кнопки, которую пользователь щелкает, чтобы инициировать запрос на отрисовку.

<StackPanel> 
  <Button Content="Save as image source" Click="SaveImageSource_Click"/> 
...
  <Grid x:Name="RenderedGrid" Height="500"/>
  <!--user adds child-item content to this Grid using other code, not shown-->
...
  <Image x:Name="RenderedImage" Stretch="None"/>
  <!-- this Image has no Source yet, will be set by a RenderTargetBitmap.RenderAsync call --> 
</StackPanel> 
private async void SaveImageSource_Click(object sender, RoutedEventArgs e) 
{                        
...
    RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(); 
    await renderTargetBitmap.RenderAsync(RenderedGrid, width, height); 
    RenderedImage.Source = renderTargetBitmap; 
}

Комментарии

С помощью RenderTargetBitmap можно выполнить такие сценарии, как применение эффектов изображения к визуальному элементу, который изначально был получен из композиции пользовательского интерфейса XAML, создания эскизов дочерних страниц для системы навигации или сохранения частей пользовательского интерфейса в качестве источника изображения, а затем совместного использования этого изображения с другими приложениями.

Так как RenderTargetBitmap является подклассом ImageSource, его можно использовать в качестве источника изображения для элементов Image или кисти ImageBrush .

Вызов RenderAsync предоставляет полезный источник изображения, но полное представление буфера содержимого отрисовки не копируется из памяти видео, пока приложение не вызывает GetPixelsAsync. Быстрее вызывать RenderAsync только (без вызова GetPixelsAsync) и использовать RenderTargetBitmap в качестве источника Image или ImageBrush , если приложение намерено отображать отрисованное содержимое и не требует данных пикселей. Возможно, вам потребуется пиксельные данные, если вы планируете записать изображение для операции DataTransferManager, например обмен контрактами Share, или если вы хотите применить эффекты к изображению или перекодировать его с помощью Windows. API Graphics.Imaging.

API RenderTargetBitmap, который используется чаще всего, — RenderAsync. Существует две перегрузки этого метода: RenderAsync(UIElement) и другая перегрузка , в которой можно указать требуемые размеры источника изображения, отличные от естественного размера исходного визуального дерева. RenderAsync — это асинхронный метод по проектированию, поэтому для большинства сценариев нет никаких гарантий точной синхронизации кадров с источником пользовательского интерфейса, но это достаточно близко для большинства сценариев.

Объект RenderTargetBitmap обычно не объявляется в пользовательском интерфейсе XAML, так как необходимо вызвать RenderAsync в коде, прежде чем иметь полезный, заполненный изображением экземпляр RenderTargetBitmap для отображения пользовательского интерфейса.

Дополнительные примеры кода использования RenderTargetBitmap см. в примере визуализации XAML для растрового изображения.

Содержимое RenderTargetBitmap может быть потеряно в редких случаях из-за взаимодействия с другими системами нижнего уровня, например, если драйвер видео сбрасывается в рамках восстановления (см. сведения об обнаружении времени ожидания и восстановлении (TDR)). В этом случае событие CompositionTarget.SurfaceContentsLost запустится. Чтобы учитывать этот случай и аналогичные случаи потери информации, приложения должны прослушивать событие CompositionTarget.SurfaceContentsLost и повторно отображать содержимое RenderTargetBitmap, вызвав RenderAsync еще раз.

Отрисованное растровое содержимое объекта RenderTargetBitmap не масштабируется автоматически при изменении текущего параметра DPI. Приложения должны повторно отрисовывать содержимое объекта RenderTargetBitmap при изменении параметров DPI текущего представления, чтобы убедиться, что отрисованное векторное содержимое остается четким. Например, изменение размера может произойти, если пользователь перемещает приложение между двумя мониторами, работающими в другом параметре DPI. Рассмотрите возможность прослушивания события DisplayInformation.DpiChanged , чтобы обнаружить эти случаи.

Максимальный размер визуального дерева XAML ограничен максимальными размерами текстуры Microsoft DirectX; дополнительные сведения см. в разделе "Ограничения ресурсов" (Direct3D 11). Это ограничение может отличаться в зависимости от оборудования, в котором выполняется приложение. Очень большое содержимое, превышающее это ограничение, может быть масштабировано для соответствия. Если ограничения масштабирования применяются таким образом, отображаемый размер после масштабирования можно запросить с помощью свойств PixelWidth и PixelHeight . Например, визуальное дерево XAML на 10000 пикселей может быть масштабировано до 4096 пикселей на 4096 пикселей, пример определенного ограничения, как принудительное оборудование, на котором выполняется приложение.

Возможности отслеживания визуальных элементов XAML и RenderTargetBitmap

Существует несколько сценариев для визуального содержимого, состоящего в XAML, которое невозможно записать в RenderTargetBitmap:

  • Содержимое, которое находится в дереве, но с его параметром Видимости не будет захвачено.
  • Содержимое, которое не подключено непосредственно к визуальному дереву XAML, и содержимое главного окна не будет записано. Это включает в себя всплывающее содержимое, которое считается как вложенное окно.
  • Содержимое, которое не может быть записано, будет отображаться как пустое на захваченном изображении, но другое содержимое в том же визуальном дереве по-прежнему может быть записано и отрисовывается (наличие содержимого, которое не может быть записано, не приведет ко всей записи этой композиции XAML).
  • Содержимое, которое находится в визуальном дереве XAML, но выключено на экран, может быть записано, пока он не находится всворачиваниивидимости = .

Конструкторы

Имя Описание
RenderTargetBitmap()

Инициализирует новый экземпляр класса RenderTargetBitmap .

Свойства

Имя Описание
Dispatcher

Всегда возвращается null в приложении пакета SDK для приложений windows. Вместо этого используйте DispatcherQueue .

(Унаследовано от DependencyObject)
DispatcherQueue

Возвращает, DispatcherQueue с которым связан этот объект. Представляет DispatcherQueue собой объект, который может получить доступ к DependencyObject потоку пользовательского интерфейса, даже если код инициируется потоком, отличным от пользовательского интерфейса.

(Унаследовано от DependencyObject)
PixelHeight

Возвращает высоту отрисованного растрового изображения в пикселях.

PixelHeightProperty

Определяет свойство зависимости PixelHeight .

PixelWidth

Возвращает ширину отрисованного растрового изображения в пикселях.

PixelWidthProperty

Определяет свойство зависимостей PixelWidth .

Методы

Имя Описание
ClearValue(DependencyProperty)

Очищает локальное значение свойства зависимостей.

(Унаследовано от DependencyObject)
GetAnimationBaseValue(DependencyProperty)

Возвращает любое базовое значение, установленное для свойства зависимостей, которое будет применяться в случаях, когда анимация не активна.

(Унаследовано от DependencyObject)
GetPixelsAsync()

Извлекает ранее отрисованное изображение RenderTargetBitmap в виде буферизованного потока байтов в формате BGRA8 .

GetValue(DependencyProperty)

Возвращает текущее эффективное значение свойства зависимостей из DependencyObject.

(Унаследовано от DependencyObject)
ReadLocalValue(DependencyProperty)

Возвращает локальное значение свойства зависимостей, если задано локальное значение.

(Унаследовано от DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

Регистрирует функцию уведомлений для прослушивания изменений в определенном экземпляре DependencyProperty в этом экземпляре DependencyObject .

(Унаследовано от DependencyObject)
RenderAsync(UIElement, Int32, Int32)

Отрисовывает моментальный снимок визуального дерева UIElement в источник изображения. Укажите значения для scaledWidth и scaledHeight , чтобы изменить измерение отрисовки исходного источника.

RenderAsync(UIElement)

Отрисовывает моментальный снимок визуального дерева UIElement в источник изображения.

SetValue(DependencyProperty, Object)

Задает локальное значение свойства зависимостей в DependencyObject.

(Унаследовано от DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

Отменяет уведомление об изменении, которое ранее было зарегистрировано путем вызова RegisterPropertyChangedCallback.

(Унаследовано от DependencyObject)

Применяется к

См. также раздел