2016-02-25 47 views
1

我有一个UserControl将文本转换为形状。然后,我可以抚摸它或用刷子填充它。当我尝试使用具有MediaElement(视频)的Visual Brush作为源时,我遇到了问题。当我直接在XAML中做如下:在风格中使用MediaElement的VisualBrush

    <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

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

回答

1

我已经看到MediaElement的各种例子与其他WPF组件没有很好地搭配,我不认为开发团队完全可以像对待其他事情一样全面地进行集成测试。这种特殊的情况似乎是一个我曾经见过的bug,在创建样式中使用的元素时,会出现几次,然后在初始化过程中被多次破坏。 MediaElement似乎在做某种类型的延迟处理,变得混乱,并认为它不再被使用。该解决方案,不管信不信,只需简单设置UnloadedBehavior="Play"。尽管我倾向于避免让XAML框架控制像这样的东西,但我个人认为,我自己使用MediaPlayer的方法是将每个实例设置为静态资源,将LoadedBehaviorUnloadedBehavior设置为并将其设置为"Manual",并使用包含依赖项属性的Blend行为手动控制回放,然后将其绑定回我的视图模型。这提供了完整的媒体元素的代码驱动控制的所有优点,而不会中断MVVM,也不必交叉手指,并希望框架能够自我运行。