본문 바로가기

Silverlight

Scroll 용 Behavior


Scrollaction

public class ScrollAction : Behavior<FrameworkElement>

    {

 

        /// <summary>

        /// Attached FrameworkElement AutomationPeer

        /// </summary>

        private AutomationPeer _peer { get; set; }

 

        /// <summary>

        /// ScrollProvider

        /// </summary>

        public IScrollProvider ScrollProvider

        {

            get

            {

                //AssociatedObject로 부터 peer를 구함

                _peer = FrameworkElementAutomationPeer.FromElement(AssociatedObject);

                //만약에 없다면 하나 만들어줌

                if (_peer == null)

                    _peer = FrameworkElementAutomationPeer.CreatePeerForElement(AssociatedObject);

                //peer Scroll Pattern 을 구해서 반환

                return _peer.GetPattern(PatternInterface.Scroll) as IScrollProvider;

            }

        }

 

        protected override void OnAttached()

        {

            base.OnAttached();

            AssociatedObject.MouseWheel += new MouseWheelEventHandler(AssociatedObject_MouseWheel);

        }

 

        protected override void OnDetaching()

        {

            base.OnDetaching();

            AssociatedObject.MouseWheel -= new MouseWheelEventHandler(AssociatedObject_MouseWheel);

            _peer = null;

        }

 

    

        void AssociatedObject_MouseWheel(object sender, MouseWheelEventArgs e)

        {

            if (e.Delta > 0)

            {

                //ScrollProvider Scroll처리

                ScrollProvider.Scroll(ScrollAmount.NoAmount, ScrollAmount.SmallDecrement);

            }

            else

            {

                ScrollProvider.Scroll(ScrollAmount.NoAmount, ScrollAmount.SmallIncrement);

            }

        }
  
}

 

 위의 소스를 이용해서 Behavior를 만드시면 DataGrid , Listbox 혹은 ScollViewer 등등에서 스크롤이 잘 작동 합니다.

하지만 단점은 위의 소스에서 보시는 것처런 Scroll 함수가 인자로 ScrollAmount를 받는데 이 enum타입은 딱 5가지 정도로 정해져 있기 때문에 세밀한 Scroll은 힘듭니다.

따라서 DataGrid와 같은 경우(내부적으로 ScrollViwer를 사용하지 않는경우)는 어쩔수 없이 위와 같은 꼼수를 통해서 사용 하지만 ScollViewer 를 사용하는 것들(ListBox등)은 ScollViwer용 Behavior(ScrollAmount를 따보 받을수 있게 Property를 빼주는)를 따로 만드셔서 ScrollViewer 자체에 붙여서 사용하시는게 좋을것 같습니다. :)