diff --git a/src/LibVLCSharp.WPF/ForegroundWindow.cs b/src/LibVLCSharp.WPF/ForegroundWindow.cs index 8c7b33fa..437eaed5 100644 --- a/src/LibVLCSharp.WPF/ForegroundWindow.cs +++ b/src/LibVLCSharp.WPF/ForegroundWindow.cs @@ -11,7 +11,8 @@ namespace LibVLCSharp.WPF internal class ForegroundWindow : Window { Window? _wndhost; - readonly FrameworkElement _bckgnd; + readonly FrameworkElement _videoHost; + readonly FrameworkElement _backgroundElement; readonly Point _zeroPoint = new Point(0, 0); private readonly Grid _grid = new Grid(); @@ -30,7 +31,7 @@ internal UIElement? OverlayContent } } - internal ForegroundWindow(FrameworkElement background) + internal ForegroundWindow(FrameworkElement videoHost, FrameworkElement? background) { Title = "LibVLCSharp.WPF"; Height = 300; @@ -42,23 +43,27 @@ internal ForegroundWindow(FrameworkElement background) ShowInTaskbar = false; Content = _grid; - DataContext = background.DataContext; + DataContext = videoHost.DataContext; - _bckgnd = background; - _bckgnd.DataContextChanged += Background_DataContextChanged; - _bckgnd.Loaded += Background_Loaded; - _bckgnd.Unloaded += Background_Unloaded; + if (background == null) + background = videoHost; + + _backgroundElement = background; + _videoHost = videoHost; + _videoHost.DataContextChanged += VideoHost_DataContextChanged; + _videoHost.Loaded += VideoHost_Loaded; + _videoHost.Unloaded += VideoHost_Unloaded; } - void Background_DataContextChanged(object? sender, DependencyPropertyChangedEventArgs e) + void VideoHost_DataContextChanged(object? sender, DependencyPropertyChangedEventArgs e) { DataContext = e.NewValue; } - void Background_Unloaded(object? sender, RoutedEventArgs e) + void VideoHost_Unloaded(object? sender, RoutedEventArgs e) { - _bckgnd.SizeChanged -= Bckgnd_SizeChanged; - _bckgnd.LayoutUpdated -= Bckgnd_LayoutUpdated; + _backgroundElement.SizeChanged -= Bckgnd_SizeChanged; + _backgroundElement.LayoutUpdated -= Bckgnd_LayoutUpdated; if (_wndhost != null) { _wndhost.Closing -= Wndhost_Closing; @@ -68,14 +73,14 @@ void Background_Unloaded(object? sender, RoutedEventArgs e) Hide(); } - void Background_Loaded(object? sender, RoutedEventArgs e) + void VideoHost_Loaded(object? sender, RoutedEventArgs e) { if (_wndhost != null && IsVisible) { return; } - _wndhost = GetWindow(_bckgnd); + _wndhost = GetWindow(_videoHost); Trace.Assert(_wndhost != null); if (_wndhost == null) { @@ -86,8 +91,8 @@ void Background_Loaded(object? sender, RoutedEventArgs e) _wndhost.Closing += Wndhost_Closing; _wndhost.LocationChanged += Wndhost_LocationChanged; - _bckgnd.LayoutUpdated += Bckgnd_LayoutUpdated; - _bckgnd.SizeChanged += Bckgnd_SizeChanged; + _backgroundElement.LayoutUpdated += Bckgnd_LayoutUpdated; + _backgroundElement.SizeChanged += Bckgnd_SizeChanged; try { @@ -131,13 +136,13 @@ void AlignWithBackground() return; } - if (PresentationSource.FromVisual(_bckgnd) == null) + if (PresentationSource.FromVisual(_backgroundElement) == null) { return; } - if (double.IsNaN(_bckgnd.ActualWidth) || double.IsNaN(_bckgnd.ActualHeight) || - _bckgnd.ActualWidth == 0 || _bckgnd.ActualHeight == 0) + if (double.IsNaN(_backgroundElement.ActualWidth) || double.IsNaN(_backgroundElement.ActualHeight) || + _backgroundElement.ActualWidth == 0 || _backgroundElement.ActualHeight == 0) { return; } @@ -162,9 +167,9 @@ void AlignWithBackground() * The video view itself natively supports scaling. */ - var startLocationFromScreen = _bckgnd.PointToScreen(_zeroPoint); + var startLocationFromScreen = _backgroundElement.PointToScreen(_zeroPoint); var startLocationPoint = source.CompositionTarget.TransformFromDevice.Transform(startLocationFromScreen); - var endLocationFromScreen = _bckgnd.PointToScreen(new Point(_bckgnd.ActualWidth, _bckgnd.ActualHeight)); + var endLocationFromScreen = _backgroundElement.PointToScreen(new Point(_backgroundElement.ActualWidth, _backgroundElement.ActualHeight)); var endLocationPoint = source.CompositionTarget.TransformFromDevice.Transform(endLocationFromScreen); Left = Math.Min(startLocationPoint.X, endLocationPoint.X); @@ -172,9 +177,9 @@ void AlignWithBackground() Width = Math.Abs(endLocationPoint.X - startLocationPoint.X); Height = Math.Abs(endLocationPoint.Y - startLocationPoint.Y); - if (Math.Abs(Width - _bckgnd.ActualWidth) + Math.Abs(Height - _bckgnd.ActualHeight) > 0.5) + if (Math.Abs(Width - _backgroundElement.ActualWidth) + Math.Abs(Height - _backgroundElement.ActualHeight) > 0.5) { - ScaleWindowContent(Width / _bckgnd.ActualWidth, Height / _bckgnd.ActualHeight); + ScaleWindowContent(Width / _backgroundElement.ActualWidth, Height / _backgroundElement.ActualHeight); } } @@ -208,9 +213,9 @@ void Wndhost_Closing(object? sender, System.ComponentModel.CancelEventArgs e) Close(); - _bckgnd.DataContextChanged -= Background_DataContextChanged; - _bckgnd.Loaded -= Background_Loaded; - _bckgnd.Unloaded -= Background_Unloaded; + _videoHost.DataContextChanged -= VideoHost_DataContextChanged; + _videoHost.Loaded -= VideoHost_Loaded; + _videoHost.Unloaded -= VideoHost_Unloaded; } protected override void OnKeyDown(KeyEventArgs e) diff --git a/src/LibVLCSharp.WPF/VideoView.cs b/src/LibVLCSharp.WPF/VideoView.cs index 557dc730..e3d54856 100644 --- a/src/LibVLCSharp.WPF/VideoView.cs +++ b/src/LibVLCSharp.WPF/VideoView.cs @@ -57,6 +57,11 @@ private static void OnMediaPlayerChanged(DependencyObject d, DependencyPropertyC private ForegroundWindow? ForegroundWindow { get; set; } private bool IsUpdatingContent { get; set; } private UIElement? ViewContent { get; set; } + + /// + /// Background element for this VideoView + /// + public FrameworkElement? BackgroundElement { get; set; } = null; /// /// ForegroundWindow management and MediaPlayer setup. @@ -78,7 +83,7 @@ public override void OnApplyTemplate() _videoHwndHost = controlHost; - ForegroundWindow = new ForegroundWindow(_videoHwndHost) + ForegroundWindow = new ForegroundWindow(_videoHwndHost, BackgroundElement) { OverlayContent = ViewContent };