我有一个UserControl,可以将文本转换为形状。然后我可以使用笔刷进行描边或填充。当我尝试使用带有MediaElement(视频)的Visual Brush作为源时,我遇到了问题。当我直接在XAML中进行如下操作时:
<custom:ExtendedTextBlock Text="Video Filled Text" FontFamily="Arial Black" FontSize="60">
<custom:ExtendedTextBlock.Fill>
<VisualBrush>
<VisualBrush.Visual>
<MediaElement Source="assets\1267066.mp4" Width="596" Height="366" LoadedBehavior="Play" Stretch="UniformToFill" MediaEnded="MediaElement_MediaEnded" MediaFailed="MediaElement_MediaFailed" MediaOpened="MediaElement_MediaOpened" />
</VisualBrush.Visual>
</VisualBrush>
</custom:ExtendedTextBlock.Fill>
</custom:ExtendedTextBlock>
效果很好。当我尝试使用相同的信息创建样式时出现问题:
<Style x:Key="VideoFill" TargetType="{x:Type custom:ExtendedTextBlock}">
<Setter Property="StrokeThickness" Value="2" />
<Setter Property="Stroke" Value="Black" />
<Setter Property="Fill">
<Setter.Value>
<VisualBrush>
<VisualBrush.Visual>
<MediaElement Source="assets/1267066.mp4" Width="596" Height="366" LoadedBehavior="Play" LoadedBehavior="Play" Stretch="UniformToFill" MediaEnded="MediaElement_MediaEnded" MediaFailed="MediaElement_MediaFailed" MediaOpened="MediaElement_MediaOpened" />
</VisualBrush.Visual>
</VisualBrush>
</Setter.Value>
</Setter>
</Style>
我没有填补。不抛出MediaOpened,不抛出MediaFailed。它只是不渲染填充。使用与SolidColorBrush,LinearGradientBrush,ImageBrush相同的方法都可以完美地运行。谁能告诉我这里发生了什么?
答案 0 :(得分:1)
我已经看到各种各样的MediaElement示例与其他WPF组件不能很好地结合使用,我认为开发团队并没有像对待其他事情那样全面地进行集成测试。这个特殊情况似乎是我见过的一个错误,它会创建一个样式中使用的元素,然后在初始化期间多次销毁。 MediaElement似乎正在进行某种类型的延迟处理,感到困惑,并认为它不再被使用。无论信不信,解决方案是简单地设置UnloadedBehavior="Play"
。
就个人而言,我倾向于避免让XAML框架控制这样的事情。我自己使用MediaPlayer的方法是使每个实例成为静态资源,将LoadedBehavior
和UnloadedBehavior
都设置为"Manual"
并使用包含依赖属性的Blend行为手动控制播放,我将绑定回我的查看模型。这提供了完整的代码驱动的媒体元素控制的所有优点,而不会破坏MVVM,也不必指责框架,并希望框架能够自行运行。