【问题标题】:Changing element height depending on a selection of combobox根据选择的组合框更改元素高度
【发布时间】:2012-04-12 06:49:30
【问题描述】:

我有一个用于选择媒体类型的组合框。我希望在选择 .vmw、.mpeg 或 .avi 文件时改变 mediaelement 的高度。如何使用 MVVM 方法实现这一点?

提前致谢

【问题讨论】:

  • 您是否希望在 MediaElement 打开不同的源时更改高度?
  • 是的,但是这个来源是从组合框中选择的

标签: wpf binding combobox


【解决方案1】:

您可以使用适当的转换器将 MediaElement 的 WidthHeight 直接绑定到其 Source 属性,该转换器会根据媒体类型选择适当的大小:

<MediaElement
    Width="{Binding Path=Source, RelativeSource={RelativeSource Self}, Converter={StaticResource MediaElementSizeConverter}, ConverterParameter=Width}"
    Height="{Binding Path=Source, RelativeSource={RelativeSource Self}, Converter={StaticResource MediaElementSizeConverter}, ConverterParameter=Height}"/>

转换器:

public class MediaElementSizeConverter : IValueConverter
{
    private const double defaultWidth = 320d;
    private const double defaultHeight = 240d;
    private const double wmvWidth = 640d;
    private const double wmvHeight = 480d;

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Uri source = value as Uri;

        if (source != null)
        {
            if (source.AbsolutePath.EndsWith(".wmv"))
            {
                return (parameter as string) == "Width" ? wmvWidth : wmvHeight;
            }

            // more media types ...
        }

        return (parameter as string) == "Width" ? defaultWidth : defaultHeight;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

【讨论】:

  • 确实非常感谢,它似乎很有用。我会试试的
  • 当我应用您提供的解决方案时,我想问一个问题。转换器工作,但源始终为空。你能帮忙解决这个问题吗?提前致谢
  • 如何设置源?我假设它绑定到 ComboBox 的 SelectedItem。
  • 当我应用您提供的解决方案时,我想问一个问题。转换器仅在我第一次调试应用程序时工作。然后它永远不会因为我更改文件。你能帮忙解决这个问题吗?提前致谢
  • 如何“更改文件”? MediaElement 的 Source 属性是否绑定到 ComboBox 的 SelectedItem 属性,ComboBox 是否包含文件名或 URI?我刚刚试了一下,效果很好。
【解决方案2】:

一种解决方案是将ComboBox 绑定到自己创建的MediaTypeDefinition 类列表。

public class MediaTypeDefinition
{
    public string Name { get; set; }

    public int Height { get; set; }
}

然后您可以将SelectedItem 绑定到媒体元素的高度。

<ComboBox x:Name="mediaTypeList" ItemsSource="{Binding Definitions}" SelectedValuePath="Name" />

<MediaElement Height="{Binding SelectedItem.Height, Elementname=mediaTypeList}" />

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2011-09-17
    • 2013-11-18
    • 2016-05-01
    相关资源
    最近更新 更多