最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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 等一系列的顏色畫(huà)刷為背景,有時(shí)我們也會(huì)使用ImageBrush添加圖片來(lái)作為界面的背景,另外常用的還有DrawingBrush以及今天需要進(jìn)行總結(jié)的VisualBrush,這些我們都是比較容易實(shí)現(xiàn)的,那么我們?nèi)绻雽④浖慕缑嬖O(shè)計(jì)成一個(gè)動(dòng)畫(huà)或者干脆播放一段視頻作為背景,這個(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è)畫(huà)刷,然后再在VisualBrush的Visual中添加我們自定義的Style,這個(gè)是一個(gè)非常重要的畫(huà)刷,如果我們對(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ò)重寫(xiě)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ò)重寫(xiě)OnApplyTemplate方法來(lái)獲取MediaElement對(duì)象,從而為其添加事件,這是一種非常有效果的方式。

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

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

相關(guān)文章

  • C#中DataGridView動(dòng)態(tài)添加行及添加列的方法

    C#中DataGridView動(dòng)態(tài)添加行及添加列的方法

    這篇文章主要介紹了C#中DataGridView動(dòng)態(tài)添加行及添加列的方法,涉及C#中DataGridView針對(duì)行與列動(dòng)態(tài)操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • C#生成唯一值的方法匯總

    C#生成唯一值的方法匯總

    這篇文章主要介紹了C#生成唯一值的方法匯總,有需要的朋友可以參考一下
    2013-11-11
  • C#中的引用類型以及特殊引用類型詳解

    C#中的引用類型以及特殊引用類型詳解

    本文詳細(xì)講解了C#中的引用類型以及特殊引用類型,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • winform 實(shí)現(xiàn)選擇文件和選擇文件夾對(duì)話框的簡(jiǎn)單實(shí)例

    winform 實(shí)現(xiàn)選擇文件和選擇文件夾對(duì)話框的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇winform 實(shí)現(xiàn)選擇文件和選擇文件夾對(duì)話框的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • C#中函數(shù)的創(chuàng)建和閉包的理解

    C#中函數(shù)的創(chuàng)建和閉包的理解

    這篇文章主要介紹了C#中函數(shù)的創(chuàng)建和閉包的理解,本文講解了動(dòng)態(tài)創(chuàng)建函數(shù)、匿名函數(shù)不足之處、理解c#中的閉包、閉包的優(yōu)點(diǎn)等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • C# 參數(shù)按照ASCII碼從小到大排序(字典序)

    C# 參數(shù)按照ASCII碼從小到大排序(字典序)

    這篇文章主要介紹了C# 參數(shù)按照ASCII碼從小到大排序(字典序)的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-04-04
  • C#實(shí)現(xiàn)windows form倒計(jì)時(shí)的方法

    C#實(shí)現(xiàn)windows form倒計(jì)時(shí)的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)windows form倒計(jì)時(shí)的方法,涉及C#桌面程序設(shè)計(jì)中時(shí)間操作的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#?winform實(shí)現(xiàn)中英文切換功能的四種方式

    C#?winform實(shí)現(xiàn)中英文切換功能的四種方式

    這篇文章主要介紹了在C#?winform應(yīng)用程序中實(shí)現(xiàn)中英文切換功能的四種方式,資源文件(Resources),本地化(Localization),動(dòng)態(tài)設(shè)置控件字體和切換語(yǔ)言環(huán)境這四種方式,下面將詳細(xì)介紹每種方式及其具體實(shí)現(xiàn),并討論它們的優(yōu)缺點(diǎn),需要的朋友可以參考下
    2024-04-04
  • C#實(shí)現(xiàn)的最短路徑分析

    C#實(shí)現(xiàn)的最短路徑分析

    C#實(shí)現(xiàn)的最短路徑分析,需要的朋友可以參考一下
    2013-03-03
  • c# 用Base64實(shí)現(xiàn)文件上傳

    c# 用Base64實(shí)現(xiàn)文件上傳

    這篇文章主要介紹了c# 用Base64實(shí)現(xiàn)文件上傳的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08

最新評(píng)論

增城市| 宕昌县| 安徽省| 屏东市| 平山县| 枣庄市| 平罗县| 长丰县| 宁都县| 镇坪县| 潞城市| 碌曲县| 和林格尔县| 即墨市| 越西县| 东台市| 平陆县| 拉萨市| 延长县| 德钦县| 武平县| 司法| 米林县| 治县。| 杭州市| 福贡县| 盘锦市| 家居| 同心县| 潜山县| 金川县| 凌海市| 兰考县| 左权县| 封开县| 绥芬河市| 崇文区| 馆陶县| 松阳县| 宜良县| 兰溪市|