VideoDrawing в главном окне XAML? - PullRequest
0 голосов
/ 05 января 2019

У меня есть следующий простой пример в WPF для воспроизведения видеофайла с использованием объекта VideoDrawing - вот код позади:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        MediaTimeline timeline = new MediaTimeline(new Uri(@"c:\test\RedRock-uhd-h264.mp4", UriKind.Absolute));
        timeline.RepeatBehavior = RepeatBehavior.Forever;
        MediaClock clock = timeline.CreateClock();
        MediaPlayer player = new MediaPlayer();
        player.Clock = clock;
        VideoDrawing drawing = new VideoDrawing();

        drawing.Rect = new Rect(0, 0, 820, 600);    //<--video size is 620 x 400 same as XAML MainWindow size
        drawing.Rect = new Rect(0, 0, 420, 280);    //<--video size is 620 x 400 same as XAML MainWindow size
        drawing.Rect = new Rect(0, 0, 220, 80);     //<--video size is 620 x 400 same as XAML MainWindow size
        drawing.Rect = new Rect(0, 0, 1, 1);        //<--video size is 620 x 400 same as XAML MainWindow size
        drawing.Rect = new Rect(0, 0, 0, 0);        //<--video does not show
        //drawing.Rect = new Rect(0, 0, 0, 0);      //<--video does not show

        drawing.Player = player;

        DrawingBrush brush = new DrawingBrush(drawing);
        this.Background = brush;            
    }
}

и вот XAML:

<Window x:Class="MyMediaPlayer.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MediaPlayer in WPF" Width="620" Height="400" 
    WindowStyle="None"
    ShowInTaskbar="True"
    AllowsTransparency="True"
    Background="Transparent"
    WindowStartupLocation="Manual"
    Left="0"
    Top="0">

</Window>

посмотрите на строки "drawing.Rect = new Rect (…) выше и обратите внимание на комментарии - независимо от того, какой размер я установил для Rect - видео всегда воспроизводится с размером основного окна XAML (620, 400) Однако мне нужно установить хотя бы какой-то размер Rect, но я не могу установить его равным 0 или закомментировать его. Похоже, что видео должно воспроизводиться с установленным размером Rect, если только он не больше основного окна XAML? Что это? Я не понимаю, что я делаю, и почему видео не воспроизводится до размера Rect?

1 Ответ

0 голосов
/ 05 января 2019

Установите режим растяжения на Нет:

brush.Stretch = Stretch.None;

Проблема с этим, конечно, в том, что у вас нет способа установить цвет области вокруг игрока. Если вы хотите управлять этим, вам придется переключиться на VisualBrush и использовать вместо него MediaElement:

// create a grid and bind it to the parent window's size
var grid = new Grid { Background = Brushes.CornflowerBlue };    // <- sets background color
grid.SetBinding(WidthProperty, new Binding
{
    RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(Window), 1),
    Path = new PropertyPath("ActualWidth"),
    Mode = BindingMode.OneWay,
    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
});
grid.SetBinding(HeightProperty, new Binding
{
    RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(Window), 1),
    Path = new PropertyPath("ActualHeight"),
    Mode = BindingMode.OneWay,
    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
});

// add the media player
grid.Children.Add(new MediaElement
{
    Source = new Uri("yourvideo.mp4", UriKind.RelativeOrAbsolute),
    LoadedBehavior = MediaState.Play,
    Stretch = Stretch.Fill,
    HorizontalAlignment = HorizontalAlignment.Center,
    VerticalAlignment = VerticalAlignment.Center,
    Width = 640,    // <-- video size
    Height = 480
});

// wrap it all up in a visual brush
this.Background = new VisualBrush { Visual = grid };
...