WPF篇(15)-Expander折叠控件+MediaElement媒体播放器

news2024/9/22 23:31:52

Expander折叠控件

Expander也是一个内容控件,它有一个标题属性和内容属性。

Expander类的定义

public class Expander : HeaderedContentControl
{
    public static readonly DependencyProperty ExpandDirectionProperty;
    public static readonly DependencyProperty IsExpandedProperty;
    public static readonly RoutedEvent ExpandedEvent;
    public static readonly RoutedEvent CollapsedEvent;
 
    public Expander();
 
    public ExpandDirection ExpandDirection { get; set; }
    public bool IsExpanded { get; set; }
 
    public event RoutedEventHandler Expanded;
    public event RoutedEventHandler Collapsed;
 
    public override void OnApplyTemplate();
    protected virtual void OnCollapsed();
    protected override AutomationPeer OnCreateAutomationPeer();
    protected virtual void OnExpanded();
 
}

Expander自身只提供了两个属性,分别是ExpandDirection和IsExpanded。

ExpandDirection属性定义了Expander的内容在打开时的方向。它是一个枚举值,分别有Down、Up、Left和Right四个方向,默认方向为Down。

IsExpanded属性用来获取或设置内容窗口是否可见。比如在后端代码中,将这个属性赋值true,意味着展开Expander。

它还有两个事件成员,分别是Expanded和Collapsed,也就是其内容在展开和隐藏时触发。

Expander示例

前端代码

<StackPanel Margin="15">
        <TextBlock Text="控件课程"/>
        <Expander Header="Button控件" 
                  ExpandDirection="Down" 
                  Expanded="Expander_Expanded" 
                  Collapsed="Expander_Collapsed">
            <Grid Background="#FFE5E5E5">
                <TextBlock TextWrapping="Wrap" Padding="10">
                    表示 Windows 按钮控件,该按钮对 Click 事件做出反应。
                    Button类 直接从 System.Windows.Controls.Primitives.ButtonBase 类继承。
                    Button是内容模型ContentControl的子类。ContentControl内容属性为 Content。
                    在用户单击 Button时做出响应的事件叫ButtonBase.Click 。                    
                </TextBlock>
            </Grid>
        </Expander>
        <Expander Header="TextBox控件" ExpandDirection="Left">
            <Grid Background="#FFE5E5E5">
                <TextBlock TextWrapping="Wrap" Padding="10">
                    TextBox控件是WPF的文本输入控件,使用户输入录入系统数据的入口之一。
                    有了此控件,用户可以将数据按照软件的流程录入进去。它允许用户输入一行或多行数据。
                </TextBlock>
            </Grid>
        </Expander>
        <Expander Header="ListBox控件" ExpandDirection="Right">
            <Grid Background="#FFE5E5E5">
                <TextBlock TextWrapping="Wrap" Padding="10">
                    ListBox控件继承自ContentControl类,是一个容器类的控件,
                    向ListBox控件中包含ListBoxItem元素向容器中添加成分,
                    也可以添加其他任意的控件。
                </TextBlock>
            </Grid>
        </Expander>
    </StackPanel>

后端代码

 public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        
        private void Expander_Expanded(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Expander展开");
        }
 
        private void Expander_Collapsed(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Expander隐藏");
 
        }
    }

在这里插入图片描述

MediaElement媒体播放器

MediaElement,一个可以播放音频或视频的控件,继承于FrameworkElement基类。MediaElement包含了常见的音频或视频格式,如果需要更强大的功能,可以考虑使用VLC库。

说明:
MediaElement 可以在两种不同的模式下使用,具体取决于驱动控件的内容:独立模式或时钟模式。 在独立模式下使用 时, MediaElement 类似于图像, Source 可以直接指定 URI。 在时钟模式下, MediaElement 可以将 视为动画的目标,因此它将在计时树中具有相应的 Timeline 和 Clock 条目。

属性说明

  • LoadedBehavior: 获取或设置加载媒体的行为,如果加载希望手动控制播放,请设置为Manual。
  • CanPause: 获取一个值,该值指示是否可以暂停媒体。
  • IsBuffering: 获取一个值,该值指示是否缓冲媒体。
  • DownloadProgress: 获取一个百分比值,该值为位于远程服务器上的内容完成的下载量。
  • BufferingProgress: 获取一个值,该值指示缓冲进度的百分比。0-1之间
  • NaturalVideoHeight:获取与媒体关联的视频的高度。
  • NaturalDuration:获取介质的自然持续时间。也就是视频播放总时长。
  • HasAudio:获取一个值,该值指示媒体是否具有音频。
  • HasVideo:获取一个值,该值指示媒体是否具有视频。
  • Position:通过媒体的播放时间获取或设置进度的当前位置。
  • SpeedRatio:获取或设置媒体的速率。也就是按几倍播放视频。
  • UnloadedBehavior:获取或设置卸载媒体的行为。
  • NaturalVideoWidth:获取与媒体关联的视频的宽度。
  • ScrubbingEnabled:获取或设置一个值,该值指示MediaElement 是否将更新帧的查找操作在暂停状态。
  • Clock:获取或设置MediaElement 媒体播放相关联的时钟。
  • Balance:获取或设置扬声器的音量比。
  • Volume:获取或设置媒体的音量。0-1之间,默认0.5
  • StretchDirection:获取或设置一个值,确定扩展的限制应用于映像。
  • Stretch:获取或设置MediaElement媒体的拉伸方式。
  • Source:获取或设置MediaElement媒体源[重点]
  • IsMuted:是否静音

事件成员

  • BufferingEnded:媒体缓冲结束时发生。
  • BufferingStarted:媒体缓冲开始时发生。
  • MediaOpened:媒体加载已完成时发生。
  • MediaFailed:遇到错误时发生。
  • MediaEnded:媒体结束时发生。
  • ScriptCommand:在媒体中遇到的脚本命令时发生。

MediaElement示例

我们以MediaElement的独立模式为例,开发一个基础版本的视频播放器,该项目将会用到MediaElement、Gird、Border、TextBlock、Button、Slider、ProgressBar等控件。

前端代码

 <Grid>
                <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition Height="auto"/>
                        <RowDefinition Height="auto"/>
                </Grid.RowDefinitions>
                <Grid>
                        <MediaElement x:Name="_MediaElement" LoadedBehavior="Manual" />
                        <Border x:Name="_Border" Background="Black">
                                <TextBlock x:Name="_TextBlock" Text="MediaElement | 媒体播放器" Foreground="LightCoral" FontSize="20"
                                           HorizontalAlignment="Center" VerticalAlignment="Center"/>
                        </Border>
                </Grid>
        
                <StackPanel Orientation="Horizontal" Grid.Row="1">
                        <Button Content="打开" Width="60" Height="25" Margin="5" Click="OpenMedia"/>
                        <Button Content="播放" Width="60" Height="25" Margin="5" Click="PlayMedia"/>
                        <Button Content="停止" Width="60" Height="25" Margin="5" Click="StopMedia"/>
                        <Button Content="后退" Width="60" Height="25" Margin="5" Click="BackMedia"/>
                        <Button Content="前进" Width="60" Height="25" Margin="5" Click="ForwardMedia"/>
                        <TextBlock Text="音量" VerticalAlignment="Center" Margin="5"/>
                        <Slider x:Name="_Slider" Width="120" VerticalAlignment="Center" Maximum="100" Value="50" ValueChanged="_Slider_ValueChanged"/>
                </StackPanel>
 
                <Grid Grid.Row="2">
                        <ProgressBar x:Name="_ProgressBar" Height="10" Margin="5"/>
                </Grid>
        </Grid>

后端代码

public partial class MainWindow : Window
    {
        private string file = string.Empty;
        public MainWindow()
        {
            InitializeComponent();
 
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(1000);
            timer.Tick += (s, e) =>
            {
                var ts = _MediaElement.Position;
                _ProgressBar.Value = ts.TotalMilliseconds;//更新当前播放进度
 
            };
            timer.Start();
        }
 
        private void OpenMedia(object sender, RoutedEventArgs e)
        {
            var openFileDialog = new Microsoft.Win32.OpenFileDialog()
            {
                Filter = "视频文件 (.mp4)|*.mp4",
                Multiselect = true
            };
            var result = openFileDialog.ShowDialog();
            if (result == true)
            {
                file = openFileDialog.FileName;
                _MediaElement.MediaOpened += _MediaElement_MediaOpened;
                _MediaElement.Source = new System.Uri(file);
                this.Title = file;
                _TextBlock.Text = file;
            }
        }
 
        private void _MediaElement_MediaOpened(object sender, RoutedEventArgs e)
        {
            if (_MediaElement.NaturalDuration.HasTimeSpan)
            {
                var ts = _MediaElement.NaturalDuration.TimeSpan;
                _ProgressBar.Maximum = ts.TotalMilliseconds;//设置播放进度条总长
            }
        }
 
        private void PlayMedia(object sender, RoutedEventArgs e)
        {
            _MediaElement.Play();//播放
            _Border.Visibility = Visibility.Collapsed;            
           
        }
 
        private void StopMedia(object sender, RoutedEventArgs e)
        {
            _MediaElement.Pause();//暂停
        }
 
        private void BackMedia(object sender, RoutedEventArgs e)
        {
            _MediaElement.Position = _MediaElement.Position - TimeSpan.FromSeconds(10);//快退10秒
        }
 
        private void ForwardMedia(object sender, RoutedEventArgs e)
        {
            _MediaElement.Position = _MediaElement.Position + TimeSpan.FromSeconds(10);//快进10秒
 
        }
 
        private void _Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            _MediaElement.Volume = _Slider.Value;//设置音量
        }
    }

在这里插入图片描述

**

从今天开始内容控件就大致给大家说完了,每个控件我都做了详细的代码演示,希望能够帮助到大家,后续会给大家更新集合控件,希望大家持续关注。

**

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3D DRAM 集成 AI 处理:一项可能取代现有 HBM 的新技术

NEO 半导体公司&#xff0c;一家专注于 3D DRAM 和 3D NAND 内存的公司&#xff0c;最近推出了其最新的 3D X-AI 芯片技术&#xff0c;这项技术有可能取代目前在 AI GPU 加速器中使用的高带宽内存 (HBM)。 据报道&#xff0c;这款 3D DRAM 集成了 AI 处理能力&#xff0c;能够在…

AI预测福彩3D采取888=3策略+和值012路或胆码测试8月17日新模型预测第59弹

经过近60期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;58期一共只错了5次&#xff0c;这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xff0c;大…

【SQL】科目种类

目录 题目 分析 代码 题目 表: Teacher ------------------- | Column Name | Type | ------------------- | teacher_id | int | | subject_id | int | | dept_id | int | ------------------- 在 SQL 中&#xff0c;(subject_id, dept_id) 是该表的主键。 该表…

PIP-INTEL:一款多功能OSINT开源情报与数据收集工具

关于PIP-INTEL PIP-INTEL是一款功能强大的工具&#xff0c;专为 OSINT&#xff08;开源情报&#xff09;和网络情报收集活动而设计。它将各种开源工具整合到一个用户友好的界面中&#xff0c;简化了研究人员和网络安全专业人员的数据收集和分析流程。 功能特性 PIP-INTEL利用…

【Python】高效的Web自动化测试利器—Python+Playwright快速上手自动化实战指南(限时开放)

文章目录 前言一.playwright是什么二.python引入playwright1.安装2.playwright命令行参数3.playwright codegen自动生成代码4.Chrome和Chromium有什么关系&#xff1f; 三.基本概念1. 无头浏览器&#xff08;Headless Browser&#xff09;2.同步和异步模式操作playwright2.1.同…

Java流程控制03:Switch选择结构

视频链接&#xff1a;Java流程控制05&#xff1a;Switch选择结构_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p37&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java 中的 switch 选择结构是一种控制流程语句&#xff0c;它允许程序根据一个变量…

JVM动态字节码注入工具-Byteman

Byteman是一个字节码操作工具&#xff0c;它使得在加载时或在应用程序运行时更改Java应用程序的操作变得简单。它无需重写或重新编译原始程序即可工作。实际上&#xff0c;Byteman甚至可以用来修改Java代码&#xff0c;这些代码构成了Java虚拟机的一部分&#xff0c;比如String…

商用自动油炸机流水线 鸡米花油炸设备的优势;

油炸机的优势主要包括操作简单、一机多用、油水分离、大容量油缸、过滤残渣设置、自动出料设置、智能控制面板、材质优良。 操作简单‌&#xff1a;油炸机操作简单&#xff0c;可单人操作&#xff0c;保证了操作人员的身体健康&#xff0c;无油烟&#xff0c;减少了厨房的污染。…

TinyWebserver的复现与改进(6):定时器处理非活动连接

如果客户端长时间没有动作&#xff0c;会占用了许多连接资源&#xff0c;严重影响服务器的性能。因此需要通过实现一个服务器定时器&#xff0c;处理这种非活跃连接&#xff0c;释放连接资源。 定时器处理流程 SIGALARM触发&#xff1a;整个流程开始于一个 SIGALARM 信号&…

Golang基于DTM的分布式事务TCC实战

Golang基于DTM的分布式事务SAGA实战-CSDN博客 源代码&#xff1a;https://github.com/Ssummer520/dtm-gin 代码在宿主机运行 docker network:bridge docker安装,安装成功后可以访问http://localhost:36789/ 打开dtm事务web-ui docker run -itd --name dtm -p 36789:36789 -p…

阿布吞的基础使用——Ubuntu

Ubuntu是Linux系统的发行版&#xff0c;Linux操作系统中比较流行的一个版本&#xff0c;广泛用于个人电脑、服务器和嵌入式设备。今天来简单讲解一下Ubuntu的基础使用。 1. 桌面环境 登录&#xff1a;安装完成后&#xff0c;启动计算机&#xff0c;输入用户名和密码登录到 Ub…

基于springboot的车辆违章信息管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【CMake】学习笔记1

文章目录 1. CMake概述2. 编写一个简单的CMakeLists.txt2.1注释2.1.1 注释行2.1.2 块注释 2.1 只有源文件 3. CMake中set使用set 基本使用set指定使用C标准set指定输出路径 4. 搜索文件 1. CMake概述 CMake 是一个项目构建工具&#xff0c;并且是跨平台的。关于项目构建我们所熟…

【安全与管理并重】揭秘公司老板如何平衡信任与效率,利用非授权监控软件优化管理!

企业面临着前所未有的竞争压力&#xff0c;同时还需要确保内部管理的有效性和数据的安全性。如何在信任与效率之间找到平衡点&#xff0c;成为了许多公司老板关注的重点。安企神软件作为一款集数据防泄密、行为监控与流程化管理于一体的综合性解决方案&#xff0c;为企业提供了…

SpringCloud集成XXL-JOB定时任务

项目场景&#xff1a; XXL-JOB是一个分布式任务调度平台&#xff0c;它能够帮助开发者轻松地实现任务的定时执行、任务调度和任务管理 接入步骤 下载XXL-JOB压缩包 链接: xxl-job XXL-JOB做为子模块 将压缩包解压&#xff0c;项目二级新建目录xxl-job&#xff0c;放入目录…

后端Spring/SpringBoot框架基础介绍

1.Spring基础介绍 spring官网&#xff1a;https://spring.io/ 官方对spring的描述&#xff1a;使java更快、更容易、更安全&#xff0c;聚焦于速度、简洁和生产力。并且是全世界最流行的Java框架。 Spring如今已经形成开发生态圈&#xff0c;它提供若干个子项目&#xff0c;每…

超声波清洗机哪个牌子效果最好?四个可靠的超声波眼镜清洗机品牌推荐

作为一个常年佩戴眼镜的用户&#xff0c;还是养宠家庭&#xff0c;对于眼镜的清洗&#xff0c;一直是倍感困扰的&#xff0c;养宠的家庭&#xff0c;每天镜片上极易沾染灰尘&#xff0c;用眼镜布擦拭真的很容易把镜片刮花。尽管有时候路过眼镜店会进去清洗&#xff0c;但是终归…

【数学建模】LINGO编程

LINGO是一种专门用于求解数学规划问题的软件包。由于LINGO执行速度快&#xff0c;易于方便地输入、求解和分析数学规划问题&#xff0c;因此在教学、科研和工业界得到了广泛应用。LINGO主要用于求解线性规划、非线性规划、一次规划和整数规划等问题&#xff0c;也可用于求解一些…

Next-Key Lock 详解及其在 REPEATABLE READ 隔离级别中的作用

Next-Key Lock 是 MySQL InnoDB 引擎中使用的一种锁定机制&#xff0c;专门用于在 REPEATABLE READ 隔离级别下防止幻读&#xff08;Phantom Reads&#xff09;。它结合了行锁&#xff08;Record Lock&#xff09;和间隙锁&#xff08;Gap Lock&#xff09;&#xff0c;能够在高…

抽卡机小程序,开启全新拆卡乐趣

近段时间&#xff0c;盲盒卡牌市场异常火爆&#xff0c;最近爆火的“小马宝莉”系列卡牌就深受消费者的喜爱&#xff0c;受到了广泛关注&#xff0c;同时也推动了卡牌市场的快速发展&#xff01;盲盒卡牌拥有隐藏款卡牌和限量款卡牌&#xff0c;具有非常大的收藏价值&#xff0…