2020년 7월 2일 목요일

WPF - Resource

1. Resource


application, window 를 포함한 controller 는 Resources 를 멤버로 갖음.
그래서 리소스를 불러올 수 있고, 하위 멤버들에게 모두 적용이 가능함.

그러므로 application 에서 Resources 를 지정하면 이는 전역 리소스가 됨.
반대로 같은 이름이면 함수 스택처럼 가장 가까운 이름의 리소스를 사용함.


1
<Grid DataContext="{x:Static local:Window1.c2}"
cs

x:Static 으로 namespace 에서 static으로 선언된걸 가져 올 수 있음.


1
<Grid DataContext="{StaticResource c3}">
cs

StaticResource 로 xaml 내에서 Resource 에 정의된걸 참조 가능.


1
CustLIst provider = (CustList)this.FindResource("custList");
cs

코드에서는 FindResources("KeyName") 으로 가져올 수 있음.


당연하지만 상위 클래스의 리소스만 들고 올 수 있음.



2. NameSpace


C# 의 자료형을 쓰기 위해선 namespace 를 지정할 필요가 있다.

예전에는 xmlns:system = "clr-namespace:System;assembly=mscorlib" 이러고 말았는데
최근에는 xmlns:system = "clr-namespace:System;assembly=System.Runtime" 으로 바꼈다.


스택 오버플로우의 name 스페이스 관련


1
2
3
4
5
6
7
8
<Window.Resources>
    <sys:String x:Key="strClass">강좌</sys:String>
    <x:Array x:Key="cboClassItem" Type="sys:String">
        <sys:String>WPF 초급</sys:String>
        <sys:String>WPF 중급</sys:String>
        <sys:String>WPF 응용 실무</sys:String>
    </x:Array>
</Window.Resources>
cs

그럼 위와같이 Resource 에 string 객체, array 등을 만들 수 있다.


3. ObjectDataProvider

1
2
3
4
5
<ObjectDataProvider x:Key="custList"
    ObjectType="{x:Type local:RemoteCustListLoader}" 
    MethodName="LoadCustList"
    IsAsynchronous="True"
/>
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class RemoteCustListLoader
{
    public CustList LoadCustList()
    {
        //진짜 데이터 없을 때의 더미 데이터
        CustList list = new CustList();
 
        list.Add(new Cust { Name = "홍길동", Age = 18 });
        list.Add(new Cust { Name = "홍길동", Age = 38 });
        list.Add(new Cust { Name = "홍길동", Age = 48 });
        list.Add(new Cust { Name = "홍길동", Age = 58 });
        list.Add(new Cust { Name = "김철수", Age = 28 });
        list.Add(new Cust { Name = "김철수", Age = 18 });
        list.Add(new Cust { Name = "김철수", Age = 38 });
        list.Add(new Cust { Name = "김철수", Age = 08 });
 
        return list;
    }
}
cs

이렇게 우리가 원하는 리소스와 더비데이터 등을 xaml 외부에서 들고 올 수 있음.

이때 윈도우 같은 것의 Resource 에 전역으로 만드는게 잘 쓰임.

IsAsynchronous 를 true 로 하지 않으면 서버와 로딩시간이 길거나 하면 화면에 미리보기가 안되니 True 로 해주는게 좋음. 그럼 하다보면 뜸.


1
2
3
4
<ObjectDataProvider.MethodParameters>
                <sys:String>20</sys:String>
                <sys:String>40</sys:String>
            </ObjectDataProvider.MethodParameters>
cs

이렇게 파라미터를 넘길 수 있음. 그럼 이걸로 필터링 등 할 수 있음.


1
2
3
4
5
6
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
    DataSourceProvider provider = (DataSourceProvider)this.FindResource("custList");
    CustList list = provider.Data as CustList;
    list.Add(new Cust("세종대왕", 30));
}
cs

이렇게 DataSourceProvider 의 Data 에 우리가 원하는 데이터가 있슴.


4. XmlDataProvider


자세한건 WPF-Xml 관련 글 을 참조





댓글 없음:

댓글 쓰기

List