我试图覆盖在我的 WPF .NET Core 3.1 应用程序中托管的 (Camera Feed)Grid
之上,但始终保持在任何其他控件之上。CaptureElement
WindowsXamlHost
CaptureElement
不能在上面叠加一个网格WindowsXamlHost/CaptureElement
吗?
Î 创建了一个示例应用程序https://github.com/ValonK/SampleWPFXamlHost。我需要CaptureElement
并且还没有找到任何东西来捕捉相机馈送并在它们上方放置一些叠加层。
Xaml 代码
<Window x:Class="SampleWPFXamlHost.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SampleWPFXamlHost"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Grid Height="200"
Width="200"
Background="Red"/>
<ContentControl HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
Content="{Binding XamlHostCaptureElement}"/>
</Grid>
</Window>
视图模型
public class MainViewModel : PropertyChangedAware
{
public MainViewModel()
{
GetUwpCaptureElement();
}
private MediaCapture _mediaCapture;
public MediaCapture MediaCapture {
get {
if (_mediaCapture == null)
_mediaCapture = new MediaCapture();
return _mediaCapture;
}
set {
_mediaCapture = value;
OnPropertyChanged(nameof(MediaCapture));
}
}
public CaptureElement CaptureElement { get; set; }
public WindowsXamlHost XamlHostCaptureElement { get; set; }
/// <summary>
/// Create / Host UWP CaptureElement
/// </summary>
private void GetUwpCaptureElement()
{
XamlHostCaptureElement = new WindowsXamlHost
{
InitialTypeName = "Windows.UI.Xaml.Controls.CaptureElement"
};
XamlHostCaptureElement.ChildChanged += XamlHost_ChildChangedAsync;
}
private async void XamlHost_ChildChangedAsync(object sender, EventArgs e)
{
var windowsXamlHost = (WindowsXamlHost)sender;
var captureElement = (CaptureElement)windowsXamlHost.Child;
CaptureElement = captureElement;
CaptureElement.Stretch = Windows.UI.Xaml.Media.Stretch.UniformToFill;
try
{
await StartPreviewAsync();
}
catch (Exception)
{
}
}
private async Task StartPreviewAsync()
{
try
{
await MediaCapture.InitializeAsync();
}
catch (UnauthorizedAccessException ex)
{
//_logger.Info($"The app was denied access to the camera \n {ex}");
return;
}
try
{
CaptureElement.Source = MediaCapture;
await MediaCapture.StartPreviewAsync();
}
catch (System.IO.FileLoadException ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
}
}
public class PropertyChangedAware : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}