在样式中使用MediaElement的VisualBrush

时间:2016-02-25 21:32:33

标签: wpf xaml

我有一个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相同的方法都可以完美地运行。谁能告诉我这里发生了什么?

1 个答案:

答案 0 :(得分:1)

我已经看到各种各样的MediaElement示例与其他WPF组件不能很好地结合使用,我认为开发团队并没有像对待其他事情那样全面地进行集成测试。这个特殊情况似乎是我见过的一个错误,它会创建一个样式中使用的元素,然后在初始化期间多次销毁。 MediaElement似乎正在进行某种类型的延迟处理,感到困惑,并认为它不再被使用。无论信不信,解决方案是简单地设置UnloadedBehavior="Play"

就个人而言,我倾向于避免让XAML框架控制这样的事情。我自己使用MediaPlayer的方法是使每个实例成为静态资源,将LoadedBehaviorUnloadedBehavior都设置为"Manual"并使用包含依赖属性的Blend行为手动控制播放,我将绑定回我的查看模型。这提供了完整的代码驱动的媒体元素控制的所有优点,而不会破坏MVVM,也不必指责框架,并希望框架能够自行运行。