【发布时间】:2012-04-12 06:49:30
【问题描述】:
我有一个用于选择媒体类型的组合框。我希望在选择 .vmw、.mpeg 或 .avi 文件时改变 mediaelement 的高度。如何使用 MVVM 方法实现这一点?
提前致谢
【问题讨论】:
-
您是否希望在 MediaElement 打开不同的源时更改高度?
-
是的,但是这个来源是从组合框中选择的
我有一个用于选择媒体类型的组合框。我希望在选择 .vmw、.mpeg 或 .avi 文件时改变 mediaelement 的高度。如何使用 MVVM 方法实现这一点?
提前致谢
【问题讨论】:
您可以使用适当的转换器将 MediaElement 的 Width 和 Height 直接绑定到其 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();
}
}
【讨论】:
Source 属性是否绑定到 ComboBox 的 SelectedItem 属性,ComboBox 是否包含文件名或 URI?我刚刚试了一下,效果很好。
一种解决方案是将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}" />
【讨论】: