【问题标题】:VisualBrush using MediaElement in a StyleVisualBrush 在样式中使用 MediaElement
【发布时间】:2016-02-25 21:32:33
【问题描述】:

我有一个将文本转换为形状的 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 相同的方法都可以完美地工作。谁能告诉我这是怎么回事?

【问题讨论】:

  • Mark Feldmans 的回答似乎已经解决了。谢谢马克!

标签: wpf xaml


【解决方案1】:

我见过各种 MediaElement 与其他 WPF 组件不能很好地配合使用的示例,我认为开发团队对那个组件的集成测试不如他们对其他组件的全面测试。这种特殊情况似乎是我见过几次出现的错误,其中创建了样式中使用的元素,然后在初始化期间多次销毁。 MediaElement 似乎正在执行某种类型的延迟处理,感到困惑并最终认为它不再被使用。信不信由你,解决方案就是简单地设置UnloadedBehavior="Play"

虽然我个人倾向于避免让 XAML 框架控制这样的事情。我自己使用 MediaPlayer 的方法是使每个实例成为静态资源,将 LoadedBehaviorUnloadedBehavior 都设置为 "Manual" 并使用包含我绑定回我的视图模型的依赖属性的 Blend 行为手动控制播放。这提供了对媒体元素进行完全代码驱动控制的所有优势,而不会破坏 MVVM,也无需担心框架会自行运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多