WPF Object Query ~

프로그래밍 2008.12.15 21:14 Posted by 아일레프

JQuery라는 것을 들어 보셨겠지요? 전 이름은 들어 보았는데 어떤 역할을 하는 놈인지는 어제 알았습니다. 그 중에서 어제 살펴본 것은 JQuery 중에서도 가장 기본적인 기능을 하는 셀렉터였는데요, 그 중 $(“:text”)라고 하는 녀석은 모든 text boxes를 선택합니다.

 

$(“:text”).css(“background-color”, “yellow”);

 

위 명령은 모든 Text Boxes 들의 background ColorYellow로 만듭니다.

 

이 정도는 WPF로 쉽게 만들 수 있겠네요 

public static class WPFQueryExtension{

        public static ElementList<T> SelectObject<T>(this DependencyObject current)

where T : DependencyObject

        {

            ElementList<T> elements = new ElementList<T>();

            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(current); i++)

            {

                DependencyObject obj = VisualTreeHelper.GetChild(current, i);

                if (obj is T)

                {

                    elements.Add(obj as T);

                }

                elements.AddRange(obj.SelectObject<T>());

            }

            return elements;

        }

    }

 

    public class ElementList<T> : List<T> where T : DependencyObject

    {

        public void PropertySet(string propertyName, object value)

        {

            foreach (T obj in this)

            {

                obj.GetType().GetProperty(propertyName).SetValue(obj, value, null);

            }

        }

    }

 

조건 문을 추가 하고 싶으면

 

public static ElementList<T> SelectObject<T>(this DependencyObject current, Func<T, bool> func) where T : DependencyObject

        {

            ElementList<T> elements = new ElementList<T>();

            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(current); i++)

            {

                DependencyObject obj = VisualTreeHelper.GetChild(current, i);

                if (obj is T)

                {

                    if (func(obj as T) == true)

                    {

                        elements.Add(obj as T);

                    }

                }

                elements.AddRange(obj.SelectObject<T>(func));

            }

            return elements;

        }

 

 

위의 코드는 아래와 같이 사용 가능 합니다.

 

this.SelectObject<TextBlock>().PropertySet("Text", "test");

this.SelectObject<TextBlock>(s => s.Text == "test").PropertySet("Text", "11");

foreach (TextBlock t in this.SelectObject<TextBlock>().Where(s => s.Text == "11"))

{

t.Text = "33";

}

.. 왠지 너무 시시하네요.. ㅜ.ㅜ 더 재미있는 것도 할 수 있을 것 같은데 ...

신고


 

티스토리 툴바