win10 uwp 自定义控件开头化

        public static FrameInfo GetFrameInfo(BitmapFrame frame)
        {
            var frameInfo = new FrameInfo
            {
                Delay = TimeSpan.FromMilliseconds(100),
                DisposalMethod = FrameDisposalMethod.Replace,
                Width = frame.PixelWidth,
                Height = frame.PixelHeight,
                Left = 0,
                Top = 0
            };

            BitmapMetadata metadata;
            try
            {
                metadata = frame.Metadata as BitmapMetadata;
                if (metadata != null)
                {
                    const string delayQuery = "/grctlext/Delay";
                    const string disposalQuery = "/grctlext/Disposal";
                    const string widthQuery = "/imgdesc/Width";
                    const string heightQuery = "/imgdesc/Height";
                    const string leftQuery = "/imgdesc/Left";
                    const string topQuery = "/imgdesc/Top";

                    var delay = metadata.GetQueryOrNull<ushort>(delayQuery);
                    if (delay.HasValue)
                        frameInfo.Delay = TimeSpan.FromMilliseconds(10 * delay.Value);

                    var disposal = metadata.GetQueryOrNull<byte>(disposalQuery);
                    if (disposal.HasValue)
                        frameInfo.DisposalMethod = (FrameDisposalMethod) disposal.Value;

                    var width = metadata.GetQueryOrNull<ushort>(widthQuery);
                    if (width.HasValue)
                        frameInfo.Width = width.Value;

                    var height = metadata.GetQueryOrNull<ushort>(heightQuery);
                    if (height.HasValue)
                        frameInfo.Height = height.Value;

                    var left = metadata.GetQueryOrNull<ushort>(leftQuery);
                    if (left.HasValue)
                        frameInfo.Left = left.Value;

                    var top = metadata.GetQueryOrNull<ushort>(topQuery);
                    if (top.HasValue)
                        frameInfo.Top = top.Value;
                }
            }
            catch (NotSupportedException)
            {
            }

            return frameInfo;
        }
      private void OnLoaded(object sender, RoutedEventArgs e)
        {
            if (Amame == 2)
            {

            }
        }

        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);

            if (Amame == 2)
            {

            }
        }

得到 gif 的音信要拔取 GetQuery
,这些点子不佳用,于是使下代码把他转类型

得明白之, loaded 是事件,可以以布局选取下代码

本通知诉我们怎么着利用 GifBitmapDecoder
把gif分开为平摆设同摆设,得到他的音讯。

足见到在构造函数时,属性没有取得价值。

            var file = "E:\\林德熙\\测试文件\\2017年9月1日 10.gif";
            var stream = new FileStream(file, FileMode.Open);
            var decoder = new GifBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);

接下来运行,查看他们之属性值是否修改

先创制一个类 用于获取 gif
的信息,需要了然,每个gif的内部的图形都生消息。

据此调用顺序是 构造-OnInitialized-Loaded

        private static T? GetQueryOrNull<T>(this BitmapMetadata metadata, string query)
            where T : struct
        {
            if (metadata.ContainsQuery(query))
            {
                object value = metadata.GetQuery(query);
                if (value != null)
                    return (T) value;
            }
            return null;
        }

一经于 OnInitialized ,同样,能够看到属性为一直不拿走价值。同时不可能赢得
ActualHeight 和 ActualWidth 的价。

其中 Delay
就是有限独图片播放的时间,FrameDisposalMethod意味着两摆图是安播放,完全替换前无异摆放或当前边无异摆放基础继续体现。

然后写 load 和 Initialized 函数。

按钮点击如下面代码,可以看看 decoder 把 gif
分开很简单,不过怎么赢得一帧的岁月。如若当 wpf 得到 gif
图片间隔,就需有些出奇形式。

以 Loaded 的早晚,可以落属性的值,而且得拿走 ActualHeight 和
ActualWidth 的价值。

参见:
http://www.thomaslevesque.com/2011/03/27/wpf-display-an-animated-gif-image/

参见:WPF概念解析一:
FrameworkElement的Loaded事件和Initialized事件

        class FrameInfo
        {
            public TimeSpan Delay { get; set; }
            public FrameDisposalMethod DisposalMethod { get; set; }
            public double Width { get; set; }
            public double Height { get; set; }
            public double Left { get; set; }
            public double Top { get; set; }

            public Rect Rect
            {
                get { return new Rect(Left, Top, Width, Height); }
            }
        }

正通知诉我们,从构造函数、loaded、Initialized 的调用过程。

当网上有那个图都是gif,那么怎么样以 wpf 解析 gif?

接下来于 MainPage 的 xaml 使用它,给他一个属性值,这里为他 2

于 decoder 就可拿走每个图片,例如写一个按钮,按一下即使切换一个图形。

        public static readonly DependencyProperty AmameProperty = DependencyProperty.Register(
            "Amame", typeof(int), typeof(MargeGlx), new PropertyMetadata(default(int)));

        public int Amame
        {
            get { return (int) GetValue(AmameProperty); }
            set { SetValue(AmameProperty, value); }
        }

倘使用把一个 gif 分开,使用的代码很简短

为此极简便易行的章程创设一个自定义控件,然后于外中间写一个属性

http://stackoverflow.com/questions/210922/how-do-i-get-an-animated-gif-to-work-in-wpf

图片 1
服从著作以知共享署名-非商业性使用-相同情势同享 4.0
国际许可协议
展开许可。欢迎转载、使用、重新宣布,但得保留作品署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd
),不得用于商业目标,基于本文修改后底著述要以同之许可发表。如暴发其它疑窦,请与自家联系

实在得下BitmapMetadata落每个图片信息,因为Metadata实际是BitmapMetadata,通过/grctlext/Delay可以博有限独图片的日,/grctlext/Disposal好取得有限单图片是何等映现,/imgdesc/Width
可以得到宽度。于是选拔下函数可以博得图片消息

图片 2

      private int n = 0;

        private void Button_OnClick(object sender, RoutedEventArgs e)
        {
            var t = decoder.Frames[n];

            Image.Source = t;
            n++;
            if (n >= decoder.Frames.Count)
            {
                n = 0;
            }
        }
            Loaded += OnLoaded;

可观望 decoder 的每个图片的 MetadataImageMetadata
,而且wr也不曾说它们其中有咋样数据。

自身赶上一个题材,我以 xaml
用了我的自定义控件,可是自己让他设置了一个值,然则几时自己才方可拿到是价?

图片 3
仍作品以知共享署名-非商业性使用-相同格局同享 4.0
国际许可协议
拓展许可。欢迎转载、使用、重新宣布,但得保留小说署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd
),不得用于商业目的,基于本文修改后底著述要以同样的许可发表。如暴发外疑问,请与我联系

Leave a Comment.