Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird gezeigt, wie Sie den Kameravorschaudatenstrom in einer WinUI 3-Desktop-App anzeigen, exklusive Steuerungsszenarien behandeln und App-Lebenszyklusereignisse verwalten. Eine Schnellstartanleitung, die die Grundlagen der Anzeige einer Kameravorschau abdeckt, finden Sie unter "Anzeigen der Kameravorschau" in einer WinUI-App.
Kamera-Vorschau anzeigen
In WinUI 3 verwenden Sie MediaPlayerElement , um die Kameravorschau anzuzeigen. Das UWP-Steuerelement CaptureElement ist in WinUI 3 nicht verfügbar.
Fügen Sie Ihrer XAML-Seite eine MediaPlayerElement hinzu:
<MediaPlayerElement x:Name="PreviewElement"
AutoPlay="True"
HorizontalAlignment="Stretch" />
Initialisieren von MediaCapture
Erstellen Sie eine MediaCapture-Instanz , und initialisieren Sie sie mit den gewünschten Einstellungen. Sie können ein bestimmtes Kameragerät angeben, indem Sie "VideoDeviceId" festlegen.
using Windows.Media.Capture;
using Windows.Devices.Enumeration;
private MediaCapture _mediaCapture;
private async Task InitializeCameraAsync()
{
_mediaCapture = new MediaCapture();
var settings = new MediaCaptureInitializationSettings
{
StreamingCaptureMode = StreamingCaptureMode.Video
};
// Optionally select a specific camera
var devices = await DeviceInformation.FindAllAsync(
DeviceClass.VideoCapture);
if (devices.Count > 0)
{
settings.VideoDeviceId = devices[0].Id;
}
try
{
await _mediaCapture.InitializeAsync(settings);
}
catch (UnauthorizedAccessException)
{
// Camera access denied — prompt the user to enable camera
// access in Windows Settings.
return;
}
}
Starten und Beenden der Vorschau
Nachdem Sie MediaCapture initialisiert haben, schließen Sie die Kamera zur Vorschauanzeige an MediaPlayerElement an. Verwenden Sie in WinUI 3 ein MediaFrameSource, um dem Player Frames zuzuführen:
using Windows.Media.Capture;
using Windows.Media.Capture.Frames;
using Microsoft.UI.Xaml.Controls;
private async Task StartPreviewAsync()
{
// Get a frame source for the preview stream
var frameSource = _mediaCapture.FrameSources.FirstOrDefault(
source => source.Value.Info.MediaStreamType ==
Windows.Media.Capture.MediaStreamType.VideoPreview
|| source.Value.Info.SourceKind ==
MediaFrameSourceKind.Color);
if (frameSource.Value != null)
{
var mediaSource = Windows.Media.Core.MediaSource
.CreateFromMediaFrameSource(frameSource.Value);
PreviewElement.Source = mediaSource;
}
}
private async Task StopPreviewAsync()
{
await _mediaCapture.StopPreviewAsync();
PreviewElement.Source = null;
}
Note
In WinUI 3 gibt es kein CaptureElement Steuerelement. Verbinden Sie stattdessen MediaCapture mit einer MediaPlayerElement, indem Sie aus einem MediaFrameSource eine MediaSource erstellen. Dadurch können Sie steuern, welche Framequelle (Frontkamera, Rückkamera usw.) die Vorschau bereitstellt. Unter "Anzeigen der Kameravorschau" in einer WinUI-App finden Sie den empfohlenen Ansatz unter Verwendung des Windows Kamerabeispiels.
Exklusive Kontrolle verwalten
Wenn eine andere App die exklusive Kontrolle über die Kamera übernimmt, erhält Ihre MediaCapture Instanz ein Failed-Ereignis. Registrieren Sie sich für dieses Ereignis, z. B. in Ihrer Initialisierungsmethode:
_mediaCapture.Failed += MediaCapture_Failed;
Räumen Sie dann die Vorschau auf, sobald das Ereignis eintritt:
private void MediaCapture_Failed(MediaCapture sender,
MediaCaptureFailedEventArgs errorEventArgs)
{
DispatcherQueue.TryEnqueue(async () =>
{
await StopPreviewAsync();
// Display an error message to the user
});
}
Important
Verwenden Sie DispatcherQueue.TryEnqueue in WinUI 3-Desktop-Apps, um Aufrufe zurück an den UI-Thread zu marshallen. Die UWP-Methode CoreDispatcher.RunAsync ist nicht verfügbar.
Lebenszyklusereignisse von Fenstern behandeln
In einer WinUI 3-Desktop-App bleibt die Kameraressource auch dann aktiv, wenn das Fenster minimiert oder ausgeblendet ist. Sie sollten die Vorschau beenden, wenn das Fenster nicht sichtbar ist, und es neu starten, wenn das Fenster wieder sichtbar wird. Registrieren Sie sich in Ihrem Fensterkonstruktor oder Ihrer Initialisierungsmethode für das VisibilityChanged-Ereignis:
this.VisibilityChanged += Window_VisibilityChanged;
Implementieren Sie dann den Handler:
private async void Window_VisibilityChanged(object sender,
Microsoft.UI.Xaml.WindowVisibilityChangedEventArgs args)
{
if (args.Visible)
{
await StartPreviewAsync();
}
else
{
await StopPreviewAsync();
}
}
Bereinigen von Ressourcen
Wenn Das Fenster geschlossen wird, beenden Sie die Vorschau, und löschen Sie die MediaCapture Instanz. Registrieren Sie sich für das Closed Ereignis, z. B. im Fensterkonstruktor:
this.Closed += Window_Closed;
Implementieren Sie dann den Handler:
private async void Window_Closed(object sender,
Microsoft.UI.Xaml.WindowEventArgs args)
{
await StopPreviewAsync();
_mediaCapture?.Dispose();
_mediaCapture = null;
}
Verwandte Inhalte
Windows developer