欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c# WPF設(shè)置軟件界面背景為MediaElement并播放視頻

 更新時(shí)間:2021年03月02日 11:36:10   作者:Hello 尋夢(mèng)者!  
這篇文章主要介紹了c# WPF如何設(shè)置軟件界面背景為MediaElement并播放視頻,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

    在我們的常見(jiàn)的軟件界面設(shè)計(jì)中我們經(jīng)常會(huì)設(shè)置軟件的背景為SolidColorBrush或者LinerColorBrush、RadialGradientBrush 等一系列的顏色畫刷為背景,有時(shí)我們也會(huì)使用ImageBrush添加圖片來(lái)作為界面的背景,另外常用的還有DrawingBrush以及今天需要進(jìn)行總結(jié)的VisualBrush,這些我們都是比較容易實(shí)現(xiàn)的,那么我們?nèi)绻雽④浖慕缑嬖O(shè)計(jì)成一個(gè)動(dòng)畫或者干脆播放一段視頻作為背景,這個(gè)對(duì)于整個(gè)軟件的效果又是一個(gè)巨大的提升。

    首先我們來(lái)看看background屬性,MSDN上的解釋是:獲取或設(shè)置用于填充控件Control的邊框之間的區(qū)域的 Brush。它的類型是:Type: System.Windows.Media.Brush,所以我們能夠使用具有Brush屬性的控件或者屬性來(lái)作為背景來(lái)填充它。

    我們首先來(lái)看看前臺(tái)樣式的設(shè)計(jì): 

<Window x:Class="TestBackGroundWorker.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ui="clr-namespace:X.UI;assembly=X.UI"  
        xmlns:local="clr-namespace:TestBackGroundWorker"
        Title="MainWindow" Height="681" Width="1000">
    <Window.Resources>
        <Style TargetType="local:BackgroundPlayer">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="local:BackgroundPlayer">
                        <MediaElement x:Name="Media" Stretch="Fill"></MediaElement>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.Background>
            <VisualBrush>
                <VisualBrush.Visual>                   
                    <local:BackgroundPlayer Source="~/Images/bg.avi"></local:BackgroundPlayer>
                </VisualBrush.Visual>
            </VisualBrush>
        </Grid.Background>
    </Grid>
</Window>

  在這里我們用到了VisualBrush這個(gè)畫刷,然后再在VisualBrush的Visual中添加我們自定義的Style,這個(gè)是一個(gè)非常重要的畫刷,如果我們對(duì)WPF的繼承關(guān)系清楚的話,我們會(huì)發(fā)現(xiàn)幾乎所有的控件都是從Visual這個(gè)頂級(jí)的基類繼承過(guò)來(lái)的,所以幾乎所有的Control都能夠作為VisualBrush的Visual,所以Grid的Background屬性是十分豐富的,這里我們定義了一個(gè)BackgroundPlayer的自定義控件,并且更改了其控件模板。

     那么我們?cè)僦攸c(diǎn)看一下這個(gè)自定義控件的后臺(tái)是如何進(jìn)行定義的:      

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace TestBackGroundWorker
{
  public class BackgroundPlayer : System.Windows.Controls.Control
  {
    static BackgroundPlayer()
    {
      DefaultStyleKeyProperty.OverrideMetadata(typeof(BackgroundPlayer), new FrameworkPropertyMetadata(typeof(BackgroundPlayer)));
    }

    public string Source
    {
      get { return (string)GetValue(SourceProperty); }
      set { SetValue(SourceProperty, value); }
    }
   
    public static readonly DependencyProperty SourceProperty =
      DependencyProperty.Register("Source", typeof(string), typeof(BackgroundPlayer), new FrameworkPropertyMetadata("", (a, b) =>
      {
        BackgroundPlayer bp = a as BackgroundPlayer;
        if (bp.Player != null)
        {
          bp.Player.Source = new Uri(b.NewValue.ToString().Replace("~", AppDomain.CurrentDomain.BaseDirectory), UriKind.RelativeOrAbsolute);
        }        
      }));

    private MediaElement _player;

    public MediaElement Player
    {
      get { return _player; }
      set { _player = value; }
    }

    public override void OnApplyTemplate()
    {
      Player = GetTemplateChild("Media") as MediaElement;
      if (null == Player)
        throw new ArgumentNullException("Media");

      Player.LoadedBehavior = MediaState.Manual;
      Player.MediaEnded += Player_MediaEnded;
      Player.MediaOpened += Player_MediaOpened;
      Player.MediaFailed += Player_MediaFailed;
      Player.Loaded += Player_Loaded;
      if (!string.IsNullOrEmpty(Source))
      {
        Player.Source = new Uri(Source.Replace("~", AppDomain.CurrentDomain.BaseDirectory), UriKind.RelativeOrAbsolute);
        Player.Play();
      }
      base.OnApplyTemplate();
    }

    void Player_Loaded(object sender, RoutedEventArgs e)
    {
    }

    void Player_MediaFailed(object sender, ExceptionRoutedEventArgs e)
    {
    }

    void Player_MediaOpened(object sender, RoutedEventArgs e)
    {
      //Player.Play();
    }

    void Player_MediaEnded(object sender, RoutedEventArgs e)
    {
      Player.Position = TimeSpan.FromMilliseconds(1);
      Player.Play();
    }

  }
}

  這里我們的自定義控件是從System.Windows.Controls.Control這里繼承過(guò)來(lái)的,我們看一下相關(guān)的代碼,然后做進(jìn)一步的分析。首先我們必須為當(dāng)前的類添加一個(gè)默認(rèn)的靜態(tài)構(gòu)造函數(shù),這個(gè)是非常重要的,它會(huì)更改默認(rèn)的Control的樣式。

static BackgroundPlayer()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(BackgroundPlayer), new FrameworkPropertyMetadata(typeof(BackgroundPlayer)));
        }

 接下來(lái)我們需要為自定義控件定義一些默認(rèn)的依賴項(xiàng)屬性,首先第一個(gè)是:Source屬性,既然我們將Control的屬性定義為MediaElement,那么我們一定要為這個(gè)MediaElement設(shè)置相關(guān)的屬性,這里我們?yōu)檫@個(gè)Source屬性定義了一個(gè)當(dāng)屬性變化時(shí)的回調(diào)函數(shù),這個(gè)在xaml中第一次為Source屬性賦值時(shí)就會(huì)觸發(fā)該回調(diào)函數(shù),所以我們經(jīng)??梢岳迷摶卣{(diào)函數(shù)來(lái)做一些操作,這個(gè)回調(diào)函數(shù)是非常有用的。

     另外我們還需要為MediaElement設(shè)置一些常見(jiàn)的屬性,比如說(shuō)當(dāng)前片源放完成后會(huì)后續(xù)進(jìn)行什么操作等。

  這里我們是通過(guò)重載基類的OnApplyTemplate方法來(lái)進(jìn)行相關(guān)的操作的,我們?cè)诹私釽PF時(shí)必須懂得,去重載這些常見(jiàn)的虛方法來(lái)完成我們的操作。當(dāng)然這也需要我們不斷去積累。

      我們來(lái)看看OnApplyTemplate這個(gè)虛方法是為了完成什么樣的操作,通過(guò)重寫OnApplyTemplate()后就可以通過(guò)GetTemplateChild方法獲取模板里的子控件了,但是OnApplyTemplate的執(zhí)行順序有問(wèn)題,當(dāng)類的構(gòu)造函數(shù)執(zhí)行后,并不是立即執(zhí)行OnApplyTemplate方法,而是延遲了一定的時(shí)間,而且如果這個(gè)自定義的控件在放到應(yīng)用的項(xiàng)目中時(shí)如果Visibility為隱藏的話,更是不會(huì)執(zhí)行OnApplyTemplate方法了,這點(diǎn)需要我們?nèi)チ粜?,在我們的程序中也是通過(guò)重寫OnApplyTemplate方法來(lái)獲取MediaElement對(duì)象,從而為其添加事件,這是一種非常有效果的方式。

      最后貼出相應(yīng)的截圖看看動(dòng)畫的效果(星空風(fēng)格圖)

以上就是c# WPF設(shè)置軟件界面背景為MediaElement并播放視頻的詳細(xì)內(nèi)容,更多關(guān)于c# WPF設(shè)置軟件界面背景為MediaElement的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論