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

基于WPF實現(xiàn)視頻封面查看器

 更新時間:2022年11月30日 09:29:14   作者:驚鏵  
這篇文章主要為大家詳細介紹了WPF如何實現(xiàn)視頻封面查看器,文中的示例代碼講解詳細,對我們學習或工作有一定幫助,感興趣的小伙伴可以了解一下

如何實現(xiàn) WPF 視頻封面查看器

  • 框架使用.NET40

  • Visual Studio 2019;
  • 實現(xiàn)視頻封面查看器NineGridView基于Grid實現(xiàn)列,使用列做主封面展示視頻播放(也可以做rtsp視頻流播放),還剩下個做候選封面區(qū)展示,當點擊封面區(qū)某個封面時進行替換主封面區(qū)視頻(流)播放。
  • 當鼠標移動到候選封面區(qū)時,動畫從上一次鼠標的位置到當前鼠標位置做移動動畫。

示例代碼

1)新建 NineGridView.cs 代碼如下:

using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Windows;
using?System.Windows.Controls;
using?System.Windows.Input;
using?System.Windows.Media;
using?System.Windows.Media.Animation;

namespace?WPFDevelopers.Controls
{
????public?class?NineGridView?:?Grid
????{
????????private?int?_rows?=?3;

????????private?int?_columns?=?3;

????????private?Dictionary<Rect,?int>?_dicRect?=?new?Dictionary<Rect,?int>();

????????private?Border?_border;

????????private?Storyboard?_storyboard;

????????private?Rect?_lastRect;

????????private?int?_last;

????????public?static?readonly?DependencyProperty?SelectBrushProperty?=
??????????DependencyProperty.Register("SelectBrush",?typeof(Brush),?typeof(NineGridView),
??????????????new?PropertyMetadata(Brushes.Red));
????????
????????public?static?readonly?DependencyProperty?BorderThicknessProperty?=
???????DependencyProperty.Register("BorderThickness",?typeof(Thickness),?typeof(NineGridView),
???????????new?PropertyMetadata(new?Thickness(1)));

????????public?NineGridView()
????????{
????????????Loaded?+=?NineGridView_Loaded;
????????????SizeChanged?+=?NineGridView_SizeChanged;
????????}

????????public?Brush?SelectBrush
????????{
????????????get?=>?(Brush)GetValue(SelectBrushProperty);
????????????set?=>?SetValue(SelectBrushProperty,?value);
????????}
??????
????????public?Thickness?BorderThickness
????????{
????????????get?=>?(Thickness)GetValue(BorderThicknessProperty);
????????????set?=>?SetValue(BorderThicknessProperty,?value);
????????}

????????private?void?NineGridView_SizeChanged(object?sender,?SizeChangedEventArgs?e)
????????{
????????????if?(_border?==?null?||?_last?==?0)?return;
????????????var?frameworkElement?=?InternalChildren[_last]?as?FrameworkElement;
????????????if?(frameworkElement?==?null)?return;
????????????_border.Width?=?frameworkElement.ActualWidth;
????????????_border.Height?=?frameworkElement.ActualHeight;
????????????var?point?=?frameworkElement.TranslatePoint(new?Point(0,?0),?this);
????????????CreateStoryboard(point);
????????}
????????private?void?NineGridView_Loaded(object?sender,?RoutedEventArgs?e)
????????{
????????????RowDefinitions.Clear();
????????????for?(int?i?=?0;?i?<?_rows;?i++)
????????????{
????????????????var?row1?=?new?RowDefinition();
????????????????RowDefinitions.Add(row1);
????????????}
????????????ColumnDefinitions.Clear();
????????????for?(int?i?=?0;?i?<?_columns;?i++)
????????????{
????????????????var?col1?=?new?ColumnDefinition();
????????????????ColumnDefinitions.Add(col1);
????????????}
????????????UIElementCollection?children?=?InternalChildren;

????????????int?numCol?=?0,?numRow?=?0;
????????????for?(int?i?=?0,?count?=?children.Count;?i?<?count;?++i)
????????????{
????????????????if?(i?>?6)?return;
????????????????UIElement?child?=?children[i];
????????????????if?(child?!=?null)
????????????????{
????????????????????if?(i?==?0)
????????????????????{
????????????????????????SetRowSpan(child,?2);
????????????????????????SetColumnSpan(child,?2);
????????????????????}
????????????????????else
????????????????????{
????????????????????????var?num?=?i?-?1;
????????????????????????var?col?=?GetColumnSpan(children[num]);
????????????????????????col?=?col?==?1???GetColumn(children[num])?:?col;
????????????????????????if?(i?+?1?<=?_columns)
????????????????????????{
????????????????????????????SetColumn(child,?col);
????????????????????????????SetRow(child,?numRow);
????????????????????????????numRow++;
????????????????????????}
????????????????????????else
????????????????????????{
????????????????????????????var?row?=?GetRowSpan(children[0]);
????????????????????????????SetColumn(child,?numCol);
????????????????????????????SetRow(child,?row);
????????????????????????????numCol++;
????????????????????????}
????????????????????}
????????????????}
????????????}
????????????if(_border?!=?null)
????????????????Children.Remove(_border);
????????????_border?=?new?Border
????????????{
????????????????BorderThickness?=?BorderThickness,
????????????????BorderBrush?=?SelectBrush,
????????????????VerticalAlignment?=?VerticalAlignment.Top,
????????????????HorizontalAlignment?=?HorizontalAlignment.Left
????????????};
????????????_border.Name?=?"PART_Adorner";
????????????_border.RenderTransform?=?new?TranslateTransform();
????????????SetRowSpan(_border,?_rows);
????????????SetColumnSpan(_border,?_columns);
????????????_border.Width?=?ActualWidth?/?_columns?-?2;
????????????_border.Height?=?ActualHeight?/?_rows?-?2;
????????????var?_translateTransform?=?(TranslateTransform)_border.RenderTransform;
????????????_translateTransform.X?=?_border.Width?*?2?+?4;
????????????Children.Add(_border);
????????????_last?=?1;
????????}

????????protected?override?void?OnPreviewMouseMove(MouseEventArgs?e)
????????{
????????????base.OnPreviewMouseMove(e);
????????????var?currentPoint?=?e.GetPosition(this);
????????????if?(_lastRect.Contains(currentPoint))
????????????????return;
????????????_dicRect.Clear();
????????????UIElementCollection?children?=?InternalChildren;
????????????for?(int?i?=?0,?count?=?children.Count;?i?<?count;?++i)
????????????{
????????????????if?(i?>=?6?||?i?==?0)?continue;
????????????????var?child?=?children[i]?as?FrameworkElement;
????????????????if?(child?!=?null)
????????????????{
????????????????????var?point?=?child.TranslatePoint(new?Point(0,?0),?this);
????????????????????var?rect?=?new?Rect(point.X,?point.Y,?child.ActualWidth,?child.ActualHeight);
????????????????????_dicRect.Add(rect,?i);
????????????????}
????????????}


????????????var?model?=?_dicRect.Keys.FirstOrDefault(x?=>?x.Contains(currentPoint));
????????????if?(model?==?default)?return;
????????????_dicRect.TryGetValue(model,?out?_last);
????????????if?(_border?==?null)?return;

????????????CreateStoryboard(new?Point(model.X,?model.Y));
????????????_border.Width?=?model.Width;
????????????_border.Height?=?model.Height;
????????????_lastRect?=?model;
????????}
????????void?CreateStoryboard(Point?point)
????????{
????????????var?sineEase?=?new?SineEase()?{?EasingMode?=?EasingMode.EaseOut?};
????????????if?(_storyboard?==?null)
????????????????_storyboard?=?new?Storyboard();
????????????else
????????????????_storyboard.Children.Clear();
????????????var?animationX?=?new?DoubleAnimation
????????????{
????????????????Duration?=?TimeSpan.FromMilliseconds(500),
????????????????To?=?point.X,
????????????????EasingFunction?=?sineEase
????????????};
????????????Storyboard.SetTargetProperty(animationX,?new?PropertyPath("(Border.RenderTransform).(TranslateTransform.X)"));
????????????_storyboard.Children.Add(animationX);
????????????var?animationY?=?new?DoubleAnimation
????????????{
????????????????Duration?=?TimeSpan.FromMilliseconds(500),
????????????????To?=?point.Y,
????????????????EasingFunction?=?sineEase
????????????};
????????????Storyboard.SetTargetProperty(animationY,?new?PropertyPath("(Border.RenderTransform).(TranslateTransform.Y)"));
????????????_storyboard.Children.Add(animationY);
????????????_storyboard.Begin(_border);

????????}
????}
}

2)新建 NineGridViewExample.xaml 代碼如下:

<UserControl?x:Class="WPFDevelopers.Samples.ExampleViews.NineGridViewExample"
?????????????xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
?????????????xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
?????????????xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"?
?????????????xmlns:d="http://schemas.microsoft.com/expression/blend/2008"?
?????????????xmlns:wpfdev="https://github.com/WPFDevelopersOrg/WPFDevelopers"
??????????????xmlns:controls="clr-namespace:WPFDevelopers.Samples.Controls"
?????????????xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"
?????????????mc:Ignorable="d"?
?????????????d:DesignHeight="450"?d:DesignWidth="800">
????<controls:CodeViewer>
????????<wpfdev:NineGridView?BorderThickness="1"?SelectBrush="Red">
????????????<wpfdev:NineGridView.Resources>
????????????????<Style?TargetType="TextBlock">
????????????????????<Setter?Property="Foreground"?Value="White"/>
????????????????????<Setter?Property="VerticalAlignment"?Value="Center"/>
????????????????????<Setter?Property="HorizontalAlignment"?Value="Center"/>
????????????????</Style>
????????????????<Style?TargetType="Border">
????????????????????<Setter?Property="Margin"?Value="1"/>
????????????????</Style>
????????????</wpfdev:NineGridView.Resources>
????????????<MediaElement?x:Name="MyMediaElement"?Loaded="MyMediaElement_Loaded"
??????????????????????????MediaEnded="MyMediaElement_MediaEnded"/>
????????????<Border?Background="#282C34">
????????????????<wpfdev:SmallPanel>
????????????????????<TextBlock?Text="信號源1"/>
????????????????????<Border?Background="{DynamicResource?PrimaryNormalSolidColorBrush}"
????????????????????????????VerticalAlignment="Top"
????????????????????????????HorizontalAlignment="Right"
????????????????????????????Padding="10,4"
????????????????????????????CornerRadius="3">
????????????????????????<TextBlock?Text="HD"/>
????????????????????</Border>
????????????????</wpfdev:SmallPanel>
????????????</Border>
????????????<Border?Background="#282C34">
????????????????<TextBlock?Text="無信號"/>
????????????</Border>
????????????<Border?Background="#282C34">
????????????????<TextBlock?Text="無信號"/>
????????????</Border>
????????????<Border?Background="#282C34">
????????????????<TextBlock?Text="無信號"/>
????????????</Border>
????????????<Border?Background="#282C34">
????????????????<TextBlock?Text="無信號"/>
????????????</Border>
????????</wpfdev:NineGridView>
????????<controls:CodeViewer.SourceCodes>
????????????<controls:SourceCodeModel?
????????????????CodeSource="/WPFDevelopers.SamplesCode;component/ExampleViews/NineGridViewExample.xaml"?
????????????????CodeType="Xaml"/>
????????????<controls:SourceCodeModel?
????????????????CodeSource="/WPFDevelopers.SamplesCode;component/ExampleViews/NineGridViewExample.xaml.cs"?
????????????????CodeType="CSharp"/>
????????</controls:CodeViewer.SourceCodes>
????</controls:CodeViewer>
</UserControl>

3)新建 NineGridViewExample.xaml.cs 代碼如下:

using?System;
using?System.IO;
using?System.Windows;
using?System.Windows.Controls;

namespace?WPFDevelopers.Samples.ExampleViews
{
????///?<summary>
????///?NineGridViewExample.xaml?的交互邏輯
????///?</summary>
????public?partial?class?NineGridViewExample?:?UserControl
????{
????????public?NineGridViewExample()
????????{
????????????InitializeComponent();
????????}

????????private?void?MyMediaElement_Loaded(object?sender,?RoutedEventArgs?e)
????????{
????????????var?path?=?"E:\\DCLI6K5UIAEmH9R.mp4";
????????????if?(File.Exists(path))
????????????????MyMediaElement.Source?=?new?Uri("path");
????????}

????????private?void?MyMediaElement_MediaEnded(object?sender,?RoutedEventArgs?e)
????????{
????????????MyMediaElement.Position?=?new?TimeSpan(0);
????????}
????????
????}
}

效果圖

到此這篇關于基于WPF實現(xiàn)視頻封面查看器的文章就介紹到這了,更多相關WPF視頻封面查看器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#利用Openxml讀取Excel數(shù)據(jù)實例

    C#利用Openxml讀取Excel數(shù)據(jù)實例

    這篇文章主要介紹了C#利用Openxml讀取Excel數(shù)據(jù)的方法,包括使用中的注意點分析及疑難探討,需要的朋友可以參考下
    2014-09-09
  • WPF應用程序本地化的最佳方法分享

    WPF應用程序本地化的最佳方法分享

    應用程序本地化有很多種方式,選擇合適的才是最好的,這篇文章主要為大家介紹了動態(tài)資源的方式,可以在不重啟應用程序的情況下進行資源的切換,需要的可以參考下
    2023-08-08
  • C#自定義簽名章實現(xiàn)方法

    C#自定義簽名章實現(xiàn)方法

    這篇文章主要介紹了C#自定義簽名章實現(xiàn)方法,涉及C#圖形繪制的相關實現(xiàn)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-08-08
  • C#基礎教程之類class與結構struct的區(qū)別

    C#基礎教程之類class與結構struct的區(qū)別

    struct是值類型,創(chuàng)建一個struct類型的實例被分配在棧上,class是引用類型,創(chuàng)建一個class類型實例被分配在托管堆上,下面這篇文章主要給大家介紹了關于C#基礎教程之類class與結構struct區(qū)別的相關資料,需要的朋友可以參考下
    2022-11-11
  • C#中IEnumerator<T>和IEnumerable的區(qū)別

    C#中IEnumerator<T>和IEnumerable的區(qū)別

    在C#中,IEnumerator<T>和IEnumerable是用于實現(xiàn)迭代的接口,本文主要介紹了C#中IEnumerator<T>和IEnumerable的區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Directory文件類的實例講解

    Directory文件類的實例講解

    下面小編就為大家分享一篇Directory文件類的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • 創(chuàng)建execl導入工具類的步驟

    創(chuàng)建execl導入工具類的步驟

    這篇文章主要介紹了創(chuàng)建execl導入工具類的步驟,需要的朋友可以參考下
    2014-04-04
  • C# API中模型與它們的接口設計詳解

    C# API中模型與它們的接口設計詳解

    這篇文章主要給大家介紹了關于C# API中模型與它們的接口設計的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06
  • C#畫圖之餅圖折線圖的實現(xiàn)方法

    C#畫圖之餅圖折線圖的實現(xiàn)方法

    這篇文章主要介紹了C#畫圖之餅圖折線圖的實現(xiàn)方法,以實例形式講述了C#畫圖的完整實現(xiàn)過程,是非常實用的技巧,有不錯的借鑒價值,需要的朋友可以參考下
    2014-09-09
  • c#讀取excel方法實例分析

    c#讀取excel方法實例分析

    這篇文章主要介紹了c#讀取excel方法,實例分析了C#讀取excel文件的原理與相關技巧,需要的朋友可以參考下
    2015-06-06

最新評論

平南县| 莱州市| 容城县| 易门县| 商南县| 澄迈县| 丰顺县| 海城市| 美姑县| 云龙县| 合江县| 邓州市| 泰安市| 宜都市| 泰兴市| 景宁| 博罗县| 苍南县| 绵阳市| 彭水| 泉州市| 左贡县| 锦州市| 大英县| 新巴尔虎左旗| 湘阴县| 利川市| 神农架林区| 仪陇县| 芮城县| 华容县| 常州市| 鄂州市| 罗平县| 宁河县| 浦江县| 浠水县| 文水县| 元阳县| 皋兰县| 呼和浩特市|