博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wp7、8丿____IValueConverter_(含参,值转换器)
阅读量:7091 次
发布时间:2019-06-28

本文共 5505 字,大约阅读时间需要 18 分钟。

示例:

1 using System; 2 using System.Globalization; 3 using System.Windows.Data; 4 using System.Windows.Media; 5  6 namespace Sounds 7 { 8     ///  9     /// 此转换器:实现MediaElementState类型的转换为Boolean类型10     /// 11     public class AudioStateConverter : IValueConverter12     {13         public object Convert(object value, Type targetType, object parameter, CultureInfo culture)14         {15             MediaElementState testState;16             if (parameter is MediaElementState)17             {18                 testState = (MediaElementState)parameter;19             }20             else21             {22                 testState = (MediaElementState)Enum.ToObject(typeof(MediaElementState), parameter);23             }24             var state = (MediaElementState)value;25             var matched = state == testState;26             return matched;27         }28 29         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)30         {31             throw new NotSupportedException();32         }33     }34 }
1     
2
3
Playing
4
Stopped
5
6
1 
3
4
5
6
7
8
9
10 11
12
13 14

 由于MediaElement很多属性直接绑定是不会变的,所以增加一些辅助类

1 using System.Windows;  2 using System.Windows.Controls;  3 using System.Windows.Interactivity;  4 using System.Windows.Media;  5 using System.ComponentModel;  6 using System.Windows.Threading;  7 using System;  8   9 namespace Sounds 10 { 11     public class MediaElementBinder : FrameworkElement 12     { 13         private DispatcherTimer timer = new DispatcherTimer(); 14  15         public MediaElementBinder() 16         { 17             // Timer interval 200 milliseconds 18             timer.Interval = new TimeSpan(0, 0, 0, 0, 200); 19             timer.Tick += timer_Tick; 20         } 21  22         void timer_Tick(object sender, EventArgs e) 23         { 24             this.Position = this.MediaElement.Position; 25         } 26  27         public MediaElement MediaElement 28         { 29             get { return (MediaElement)GetValue(MediaElementProperty); } 30             set { SetValue(MediaElementProperty, value); } 31         } 32         public static readonly DependencyProperty MediaElementProperty = 33             DependencyProperty.Register( 34                 "MediaElement", 35                 typeof(MediaElement), 36                 typeof(MediaElementBinder), 37                 new PropertyMetadata(OnMediaElementChanged)); 38         private static void OnMediaElementChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 39         { 40             var mediator = (MediaElementBinder)o; 41             var mediaElement = (MediaElement)(e.NewValue); 42             if (null != mediaElement) 43             { 44                 mediaElement.CurrentStateChanged += mediator.MediaPlayer_CurrentStateChanged; 45                 mediaElement.MediaOpened += mediator.MediaPlayer_MediaOpened; 46             } 47         } 48  49          50         51         public MediaElementState CurrentState 52         { 53             get { return (MediaElementState)GetValue(CurrentStateProperty); } 54             set { SetValue(CurrentStateProperty, value); } 55         } 56  57         public static readonly DependencyProperty CurrentStateProperty = 58             DependencyProperty.Register("CurrentState", typeof(MediaElementState), typeof(MediaElementBinder), new PropertyMetadata(null)); 59  60  61  62  63         public TimeSpan Position 64         { 65             get { return (TimeSpan)GetValue(PositionProperty); } 66             set { SetValue(PositionProperty, value); } 67         } 68  69         // Using a DependencyProperty as the backing store for Position.  This enables animation, styling, binding, etc... 70         public static readonly DependencyProperty PositionProperty = 71             DependencyProperty.Register("Position", typeof(TimeSpan), typeof(MediaElementBinder), new PropertyMetadata(null)); 72  73  74  75         public Duration Duration 76         { 77             get { return (Duration)GetValue(DurationProperty); } 78             set { SetValue(DurationProperty, value); } 79         } 80  81         // Using a DependencyProperty as the backing store for Duration.  This enables animation, styling, binding, etc... 82         public static readonly DependencyProperty DurationProperty = 83             DependencyProperty.Register("Duration", typeof(Duration), typeof(MediaElementBinder), new PropertyMetadata(null)); 84  85  86         private void MediaPlayer_MediaOpened(object sender, RoutedEventArgs e) 87         { 88             var element =sender as MediaElement; 89             this.Duration = element.NaturalDuration; 90         }         91  92  93         private void MediaPlayer_CurrentStateChanged(object sender, System.Windows.RoutedEventArgs e) 94         { 95             this.CurrentState = (sender as MediaElement).CurrentState; 96  97             if (this.CurrentState == MediaElementState.Playing) 98             { 99                 timer.Start();100             }101             else102             {103                 timer.Stop();104             }105         }106         107     }108 }

 

转载于:https://www.cnblogs.com/qq278360339/archive/2013/01/07/2849500.html

你可能感兴趣的文章
磁盘管理二(LVM及磁盘配额)
查看>>
PowerShell DSC(二)拆分配置信息
查看>>
c++ 广义表
查看>>
网络 http服务器-v2-epoll版本
查看>>
我的友情链接
查看>>
Centos 6.3 安装 VNC
查看>>
交换机基本命令的配置
查看>>
esxi中虚拟机中GTX1070
查看>>
docker
查看>>
vc char * 转换为 LPCTSTR的方法
查看>>
Android adb 使用详细介绍(含adb使用命令行)
查看>>
LNMP安装+cacti
查看>>
我的友情链接
查看>>
iOS 高德地图(二)(进阶具体使用的细节)
查看>>
ffmpeg常用命令
查看>>
app2sd功能解读
查看>>
TCP/IP协议族-四层网络模型(真正的实现不是7层)
查看>>
负载均衡之后的如何让应用程序获取客户端真实IP
查看>>
Integer对象的一些误解
查看>>
ubuntu下添加新用户,踢出在线用户
查看>>