Click here to Skip to main content
15,885,216 members
Articles / Desktop Programming / WPF

Wrap Panel Virtualization

Rate me:
Please Sign up or sign in to vote.
4.95/5 (18 votes)
2 Jan 2012CPOL2 min read 53.2K   5.6K   41  
WrapPanel doesn't support virtualization. But we can improve the performance by simulating virtualization.
using System;
using System.Collections.Generic;
using System.Text;
using ID3.ID3v2Frames;
using System.IO;

/*
 * This namespace contain Frames that is usefull for sending and recieving
 * mpeg files over streams. ex listening to audio from internet
 */
namespace Tags.ID3.ID3v2Frames.StreamFrames
{
    /// <summary>
    /// A class for PositionSynchronised frame
    /// </summary>
    public class PositionSynchronisedFrame : Frame
    {
        private TimeStamps _TimeStamp;
        private long _Position;

        /// <summary>
        /// Create new PositionSynchronisedFrame
        /// </summary>
        /// <param name="FrameID">FrameID for this frame</param>
        /// <param name="Flags">Frame Flags</param>
        /// <param name="Data">TagStream to read data from</param>
        /// <param name="Length">Maximum available length for this frame</param>
        public PositionSynchronisedFrame(string FrameID, FrameFlags Flags, TagStream Data, int Length)
            : base(FrameID, Flags)
        {
            _TimeStamp = (TimeStamps)Data.ReadByte();
            if (!IsValidEnumValue(_TimeStamp, ExceptionLevels.Error, FrameID))
                return;

            Length--;

            byte[] Long = new byte[8];
            byte[] Buf = new byte[Length];

            Data.Read(Buf, 0, Length);
            Buf.CopyTo(Long, 8 - Buf.Length);
            Array.Reverse(Long);
            _Position = BitConverter.ToInt64(Long, 0);
        }

        /// <summary>
        /// create new PositionSynchronised frame
        /// </summary>
        /// <param name="Flags">Flags of frame</param>
        /// <param name="TimeStamp">TimeStamp to use for frame</param>
        /// <param name="Position">Position of frame</param>
        public PositionSynchronisedFrame(FrameFlags Flags, TimeStamps TimeStamp,
            long Position)
            : base("POSS", Flags)
        {
            this.TimeStamp = TimeStamp;
            _Position = Position;
        }

        /// <summary>
        /// Gets or sets current frame TimeStamp
        /// </summary>
        public TimeStamps TimeStamp
        {
            get
            { return _TimeStamp; }
            set
            {
                if (!Enum.IsDefined(typeof(TimeStamps), value))
                    throw (new ArgumentException("This is not valid value for TimeStamp"));

                _TimeStamp = value;
            }
        }

        /// <summary>
        /// Gets or sets current frame Position
        /// </summary>
        public long Position
        {
            get
            { return _Position; }
            set
            { _Position = value; }
        }

        #region -> Override Method and properties <-

        /// <summary>
        /// Indicate if current frame data is valid
        /// </summary>
        protected override bool OnValidating()
        {
            return true;
        }

        /// <summary>
        /// Writing Data to specific TagStream
        /// </summary>
        protected override void OnWritingData(TagStream tg, int MinorVersion)
        {
            tg.WriteByte((byte)_TimeStamp);

            byte[] Buf;
            Buf = BitConverter.GetBytes(_Position);
            Array.Reverse(Buf);
            tg.Write(Buf, 0, 8);
        }

        /// <summary>
        /// Gets lenght of current frame
        /// </summary>
        /// <returns>int contains current frame length</returns>
        protected override int OnGetLength()
        {
            return 9;
        }

        #endregion
    }

    /// <summary>
    /// A class for RecomendedBufferSize Frame
    /// </summary>
    public class RecomendedBufferSizeFrame : Frame
    {
        private uint _BufferSize;
        private bool _EmbededInfoFlag;
        private uint _OffsetToNextTag;

        /// <summary>
        /// Create new RecomendedBufferSize
        /// </summary>
        /// <param name="FrameID">Characters tag identifier</param>
        /// <param name="Flags">2 Bytes flags identifier</param>
        /// <param name="Data">Contain Data for this frame</param>
        /// <param name="Length">Length to read from FileStream</param>
        public RecomendedBufferSizeFrame(string FrameID, FrameFlags Flags, TagStream Data, int Length)
            : base(FrameID, Flags)
        {
            _BufferSize = Data.ReadUInt(3);
            _EmbededInfoFlag = Convert.ToBoolean(Data.ReadByte());

            if (Length > 4)
                _OffsetToNextTag = Data.ReadUInt(4);
        }

        /// <summary>
        /// Create new RecomendedBufferSize
        /// </summary>
        /// <param name="Flags">Flags of frame</param>
        /// <param name="BufferSize">Recommended Buffer size</param>
        /// <param name="EmbededInfoFlag">EmbededInfoFlag</param>
        /// <param name="OffsetToNextTag">Offset to next tag</param>
        public RecomendedBufferSizeFrame(FrameFlags Flags, uint BufferSize,
            bool EmbededInfoFlag, uint OffsetToNextTag)
            : base("RBUF", Flags)
        {
            _BufferSize = BufferSize;
            _EmbededInfoFlag = EmbededInfoFlag;
            _OffsetToNextTag = OffsetToNextTag;
        }

        /// <summary>
        /// Gets or Sets Buffer size for current frame
        /// </summary>
        public uint BufferSize
        {
            get
            {
                return _BufferSize;
            }
            set
            {
                if (value > 0xFFFFFF)
                    throw (new ArgumentException("Buffer size can't be greater 16,777,215(0xFFFFFF)"));

                _BufferSize = value;
            }
        }

        /// <summary>
        /// Gets or Sets current frame EmbeddedInfoFlag
        /// </summary>
        public bool EmbededInfoFlag
        {
            get { return _EmbededInfoFlag; }
            set { _EmbededInfoFlag = value; }
        }

        /// <summary>
        /// Gets or Sets Offset to next tag
        /// </summary>
        public uint OffsetToNextTag
        {
            get
            {
                return _OffsetToNextTag;
            }
            set
            {
                _OffsetToNextTag = value;
            }
        }

        #region -> Override Method and properties <-

        /// <summary>
        /// Gets length of current frame
        /// </summary>
        /// <returns>int contains length of current frame</returns>
        protected override int OnGetLength()
        {
            // 3: Buffer Size
            // 1: Info Flag
            // 4: Offset to next tag (if available)
            return 4 + (_OffsetToNextTag > 0 ? 4 : 0);
        }

        /// <summary>
        /// Writing Data to specific TagStream
        /// </summary>
        protected override void OnWritingData(TagStream tg, int MinorVersion)
        {
            byte[] Buf;
            int Len = Length;

            Buf = BitConverter.GetBytes(_BufferSize);
            Array.Reverse(Buf);
            tg.Write(Buf, 0, Buf.Length);

            tg.WriteByte(Convert.ToByte(_EmbededInfoFlag));

            if (_OffsetToNextTag > 0)
            {
                Buf = BitConverter.GetBytes(_OffsetToNextTag);
                Array.Reverse(Buf);
                tg.Write(Buf, 0, Buf.Length);
            }
        }

        /// <summary>
        /// Indicate if current frame data is valid
        /// </summary>
        protected override bool OnValidating()
        {
            if (_BufferSize != 0)
                return true;
            else
                return false;
        }

        #endregion
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior) KAZ Software Limited
Bangladesh Bangladesh
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions