C#/WPF 将 Window 调整为 MediaElement 的原始内容大小

C#/WPF Resize Window to MediaElement's Original Content size

我有一个 Window,它根据内容 (MediaElement) 动态调整大小。

为此,我使用 Window 和属性 SizeToContent="WidthAndHeight"。 我的 MediaElement 是这样设置的 Stretch="Uniform" StretchDirection="DownOnly".

使用这些设置,Window 将与 MediaElement 控件的原始大小一样大。但是 Stretching 设置为 DownOnly,我希望可以将 window 变大。 但是,当我将属性 StretchDirection 设置为两者时,Window 将在我使用 MediaElement 加载另一部电影时最大化。

我希望 Window 具有 MediaElement 的大小,但是当我使 Window 变大时,我希望 MediaElement 也变大。

提前感谢您的帮助!

这是 WPF Window

<base:ContentWindow x:Class="ExplorerExtension.WindowsMediaWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:base="clr-namespace:ExplorerExtension" ShowActivated="False" 
WindowStyle="None" ResizeMode="CanResizeWithGrip" SizeToContent="WidthAndHeight">
    <Grid>
        <MediaElement x:Name="MediaEL" MediaOpened="MediaEL_MediaOpened"
                  LoadedBehavior="Manual" Stretch="Uniform" StretchDirection="DownOnly"/>
    </Grid>
</base:ContentWindow>

和代码

    public WindowsMediaWindow()
    {
        InitializeComponent();
        MediaEL.Source = new Uri("---");
    }

注意:所有视频都有不同的尺寸,所以我无法设置固定的宽度或高度

很抱歉,我无法确定您问题的原因。但是这里有一个解决方案。

解法:

一开始设置 StretchDirection="DownOnly",但是当您更改 window 的大小时,将其设置为 UpOnly

技术说明:

为此,您必须订阅 WindowSizeChanged 事件。但问题是,此事件也会在应用程序启动时触发。因此,您必须在加载 window.

后订阅该事件

因此,首先订阅 window 的 Loaded 事件,然后在该事件处理程序中订阅 SizeChanged 事件:

XAML(在 window 标签中):

Loaded="Window_Loaded"

C#:

private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
    MediaEL.StretchDirection = StretchDirection.UpOnly;
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    this.SizeChanged += Window_SizeChanged;
}

你也可以参考this文章,它用很好的例子定义了StretchDirection