如何在WPF中工作?

如何在WPF中工作?

我应该使用什么样的控制类型-ImageMediaElement等等?



森栏
浏览 412回答 3
3回答

红糖糍粑

我发布了一个解决方案,扩展图像控制和使用GIF解码器。GIF解码器具有帧属性。我把FrameIndex财产。事件ChangingFrameIndex将源属性更改为与FrameIndex(即在解码器中)。我猜GIF每秒有10帧。class&nbsp;GifImage&nbsp;:&nbsp;Image{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;bool&nbsp;_isInitialized; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;GifBitmapDecoder&nbsp;_gifDecoder; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Int32Animation&nbsp;_animation; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;FrameIndex &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get&nbsp;{&nbsp;return&nbsp;(int)GetValue(FrameIndexProperty);&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;{&nbsp;SetValue(FrameIndexProperty,&nbsp;value);&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;Initialize() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_gifDecoder&nbsp;=&nbsp;new&nbsp;GifBitmapDecoder(new&nbsp;Uri("pack://application:,,,"&nbsp;+&nbsp;this.GifSource),&nbsp;BitmapCreateOptions.PreservePixelFormat, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitmapCacheOption.Default); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_animation&nbsp;=&nbsp;new&nbsp;Int32Animation(0,&nbsp;_gifDecoder.Frames.Count&nbsp;-&nbsp;1,&nbsp;new&nbsp;Duration(new&nbsp;TimeSpan(0,&nbsp;0,&nbsp;0,&nbsp;_gifDecoder.Frames.Count&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;10,&nbsp;(int)((_gifDecoder.Frames.Count&nbsp;/&nbsp;10.0&nbsp;-&nbsp;_gifDecoder.Frames.Count&nbsp;/&nbsp;10)&nbsp;*&nbsp;1000)))); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_animation.RepeatBehavior&nbsp;=&nbsp;RepeatBehavior.Forever; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.Source&nbsp;=&nbsp;_gifDecoder.Frames[0]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_isInitialized&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;GifImage() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VisibilityProperty.OverrideMetadata(typeof&nbsp;(GifImage), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;FrameworkPropertyMetadata(VisibilityPropertyChanged)); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;VisibilityPropertyChanged(DependencyObject&nbsp;sender,&nbsp;DependencyPropertyChangedEventArgs&nbsp;e) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((Visibility)e.NewValue&nbsp;==&nbsp;Visibility.Visible) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((GifImage)sender).StartAnimation(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((GifImage)sender).StopAnimation(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;readonly&nbsp;DependencyProperty&nbsp;FrameIndexProperty&nbsp;= &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DependencyProperty.Register("FrameIndex",&nbsp;typeof(int),&nbsp;typeof(GifImage), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;UIPropertyMetadata(0,&nbsp;new&nbsp;PropertyChangedCallback(ChangingFrameIndex))); &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;void&nbsp;ChangingFrameIndex(DependencyObject&nbsp;obj,&nbsp;DependencyPropertyChangedEventArgs&nbsp;ev) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;gifImage&nbsp;=&nbsp;obj&nbsp;as&nbsp;GifImage; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gifImage.Source&nbsp;=&nbsp;gifImage._gifDecoder.Frames[(int)ev.NewValue]; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;<summary> &nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;Defines&nbsp;whether&nbsp;the&nbsp;animation&nbsp;starts&nbsp;on&nbsp;it's&nbsp;own &nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;</summary> &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;bool&nbsp;AutoStart &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get&nbsp;{&nbsp;return&nbsp;(bool)GetValue(AutoStartProperty);&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;{&nbsp;SetValue(AutoStartProperty,&nbsp;value);&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;readonly&nbsp;DependencyProperty&nbsp;AutoStartProperty&nbsp;= &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DependencyProperty.Register("AutoStart",&nbsp;typeof(bool),&nbsp;typeof(GifImage),&nbsp;new&nbsp;UIPropertyMetadata(false,&nbsp;AutoStartPropertyChanged)); &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;AutoStartPropertyChanged(DependencyObject&nbsp;sender,&nbsp;DependencyPropertyChangedEventArgs&nbsp;e) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((bool)e.NewValue) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(sender&nbsp;as&nbsp;GifImage).StartAnimation(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;string&nbsp;GifSource &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get&nbsp;{&nbsp;return&nbsp;(string)GetValue(GifSourceProperty);&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;{&nbsp;SetValue(GifSourceProperty,&nbsp;value);&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;readonly&nbsp;DependencyProperty&nbsp;GifSourceProperty&nbsp;= &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DependencyProperty.Register("GifSource",&nbsp;typeof(string),&nbsp;typeof(GifImage),&nbsp;new&nbsp;UIPropertyMetadata(string.Empty, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GifSourcePropertyChanged)); &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;GifSourcePropertyChanged(DependencyObject&nbsp;sender,&nbsp;DependencyPropertyChangedEventArgs&nbsp;e) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(sender&nbsp;as&nbsp;GifImage).Initialize(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;<summary> &nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;Starts&nbsp;the&nbsp;animation &nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;</summary> &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;StartAnimation() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!_isInitialized) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.Initialize(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeginAnimation(FrameIndexProperty,&nbsp;_animation); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;<summary> &nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;Stops&nbsp;the&nbsp;animation &nbsp;&nbsp;&nbsp;&nbsp;///&nbsp;</summary> &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;StopAnimation() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeginAnimation(FrameIndexProperty,&nbsp;null); &nbsp;&nbsp;&nbsp;&nbsp;}}用法示例(XAML):<controls:GifImage&nbsp;x:Name="gifImage"&nbsp;Stretch="None"&nbsp;GifSource="/SomeImage.gif"&nbsp;AutoStart="True"&nbsp;/>
打开App,查看更多内容
随时随地看视频慕课网APP