2016-02-25 48 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,也不必交叉手指,並希望框架能夠自我運行。