통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
WPF & Silverlight 포럼마을입니다.
  마을등급 WPF & Silverlight   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 서학수 주민 728 since 2008-07-17
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
[마을 게시판]
WPF 강좌
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 강좌&팁
 SL5...Daum RSS Reader  | Silverlight 2011-06-14 오후 11:52:44
 kaki104  kaki104님께 메시지 보내기kaki104님을 내 주소록에 추가합니다.kaki104님의 개인게시판 가기 번호: 155 추천:0  / 읽음:10,580

Silverlight5 Daum RSS Reader

 

간단하게 RSS 리더기를 구현했습니다.

 

***이 프로그램은 마우스 오른쪽 버튼을 눌러서 컴퓨터에 설치 하셔야지만 내용이 나옵니다.

 

 

1.개발환경

1-1. Silverlight 5 beta

1-2. Telerik RadControl for Silverlight

1-3. 그 외..MVVM, MEF 등등..

 

2. 기본사항

전체적으로 사용한 기술들은 기존에 twitter 클라이언트 게시물에 나와 있는 내용들을 복습하는 정도로 생각하면된다.

 

2-1. 기본 클래스

DevpiaClassLibrary 프로젝트를 참고한다.

 

3개의 클래스가 존재한다.

 

CRSSImage : 이미지 정보

 

CRSSChannel : 채널 정보

 

CRSSItem : 아이템 정보

 

2-2. ViewModel

 

        //현재 선택된 채널

        CRSSChannel rsschannel;
        public CRSSChannel RSSChanne ...

 

        //체널 옵져버블콜렉션

        CRSSChannels rsschannels;
        public CRSSChannels RSSChannels ...

 

        //웹클래스

        WebClient rss;        

    

        //뷰모델에서 메시지를 출력할때 사용할려고 했는데..사용된적은 없는듯..ㅋ

        string rssmessage;
        public string RSSMessage

 

        //생성자
        public RSSViewModel()        

 

        //RSS XML 파싱하는 부분

        void rss_DownloadStringCompleted ...

 

 

        ICommand loadrss;

        //RSS 조회용 ICommand
        public ICommand LoadCommand  : XAML에서 사용되는 명령

        //RSS 처리 함수

        public void LoadOperation(Object obj)

 

 

        ICommand selectchannel;

        //선택시 실행될 Command : XAML에서 사용되는 명령
        public ICommand SelectCommand

        //선택시 실행될 함수

        public void SelectOperation(System.Windows.Controls.ListBox lstbox)

 

 

        //만들어 놓기는 했는데..사용하지 않는..

        ICommand selectitem;
        public ICommand SelectItemCommand

        public void SelectItemOperation(RadCoverFlow ctl)

 

        //내용중 Uri만 가지고 오는 함수

        private string GetUri(string Desc) ...

 

        //내용중 Data만 가지고 오는 함수

        private string GetData(string Desc) ...

 

        //파싱할때 사용하는 함수

        private string GetValue(Object sValue) ...

 

 

3. 전체적인 프로세스

 

3-1.  MaigPage.xaml 실행

   

3-2.  MainPage.xaml.cs에서 RSSViewModel Import

 

3-3. LoadOperation 실행(cs단에서 직접 호출함)

       :한번은 해줘야 뭐라도 뜨기 때문에..그냥 해줌..

 

3-4. 실행되면 Daum RSS를 읽어 오고

       내용을 파싱해서 RSSChannel에 넣고 그걸 RSSChannels에 넣어 주면

 

3-5. MainPage에 있는 왼쪽 ListBox에 Channel목록이 출력되고

 

3-6. 채널을 하나 선택하면

 

3-7. 오른쪽에 RadCoverFlow 컨트롤에서 채널의 Item들이 보여진다.

 

3-8. 상단에 다른 채널을 클릭하면 그 채널이 추가되고

 

3-9. 새로 생긴 채널을 선택하면 새로운 채널의 처음 Item을 보여준다..

 

3-10. 이전 채널을 선택하면 아까 보던 Item이 보인다.

 

..

 

4. 이 프로젝은 디자인에 시간이 무지 많이 들어간 프로젝이다.

ㅋㅋ 크게 이쁘지는 안은데..시간은 좀 들었다는.. 화면 중간에 있는 GridSplitter 사용도 처음해보고

그래도 디자인이 약간 마음에 들지 않는 부분이 있기는 한데..더 이상은 나의 한계를 시험해야할 것 같아서..패수

 

실제로 프로젝 소스만 놓구 보면 쉽게 만들 수 있을 것 같지만..이걸 일일이 코딩해서 만들려고 하면

짜증 장난 아니다. 역시 디자인 할때는 블랜드가 짱인..블랜드와 VS2010을 적절히 섞어서 쓰고

만이 만들어 보면 나중에는 좀 쉽게 하지 안을까하는..

 

추가적으로 좀더 많은 RSS 주소를 사용하도록 하고 싶었는데..

시간이 없는 관계로 첫화면과 분야별 뉴스만 메뉴를 오픈해 놓았다. 다른 메뉴도 약간만 수정하면 사용 할 수 있을 것이다.

 

5. 어려웠던 점

5-1. GridSplitter 사용하기

블랜드 디자인 타임에서 그리드스플릿터 올려 놓구 이렇궁 저렇궁 해봤는데 지금 소스처럼 만드는 것이 가장 심플한듯

저넘을 사용할려면 바탕이 Grid여야하고 그리드에 컬럼이나 로우가 하나 정도 존재한 상태에서만 사용 해야한다.

 

5-2. 보더에 백그라운드 이미지 깔고 그위에 컨트롤 올리고 배경 이미지 잘 나오게 만들기

백그라운드 이미지는 Grid를 Border위에 올리고 이미지 깔고

 

  <Border RenderTransformOrigin="0.5,0.5">

   //보더에 백그라운드 이미지 깔기
   <Border.Background>
    <ImageBrush ImageSource="/Images/daum_main.png" Opacity="0.5" Stretch="None">
     <ImageBrush.RelativeTransform>
      <CompositeTransform/>
     </ImageBrush.RelativeTransform>
    </ImageBrush>
   </Border.Background>

기존적으로 배경색이 있는 컨트롤(ListBox)은 Background="{x:Null}" 로 배경색을 지워주면 배경색이나 이미지가 뜨는..

그러나..잘 앙댈때도 있으니..하다가 앙대면..일단 패스하는 습관을..

 

5-3. 채널에서 보던 내용을 유지하기

8

처음에 생각할때는 간단할 줄 알았는데..약간 시간이 걸렸다.

일단

 

<telerik:RadCoverFlow x:Name="radCoverFlow1" DataContext="{Binding RSSChannel}" ItemsSource="{Binding Item}" 

                                   Grid.Column="1" Grid.Row="1"
                                   ItemTemplate="{StaticResource RSSItemTemplate}" CameraViewpoint="Center" 
                                   FontSize="13.333" IsVirtualizing="True" ItemScale="0.7" 
                                   DistanceBetweenItems="150"
                                   SelectedItem="{Binding CurrentItem, Mode=TwoWay}"  Margin="9,0,0,0">

바인딩의 기본은 OneWay이다. 이걸 TwoWay로 해 놓으면 CurrentItem이란 프로퍼티도 컨트롤의 반응에 따라

변하게 되어있다.

그런데 문제는 이넘이 다른 채널을 찍으면 그냥 슉~하고 이동하는게 아니고 기존 채널의 CurrentItem을 null로 바꾸고

이동을 한다. 왜 쓸데 없는 짓을 하는지..그걸 찾는데 시간이 좀 걸렸는데..

 

해결은

CDaum.cs파일에서

 

        CRSSItem currentitem;
        public CRSSItem CurrentItem
        {
            get
            {
                return currentitem;
            }
            set
            {
                if (currentitem != value && value != null)
                {
                    currentitem = value;
                    OnPropertyChange("CurrentItem");
                }
            }
        }

위에 부분을 추가해서 null이 들어오면 입력하지 못하도록 막아버렸다.

그래서 채널을 이동하더라도 기존 채널에서 어디까지 봤는지 기억을 하고 있는 것이다.

 

 

6. 세부적으로 문의 사항이 있으면 이메일(kaki104@nate.com)이나 리플로 남기면 알려주겠다.

 

7. OpenAPI 강좌는 이정도 하고 다음에는 실제 프로젝에서 사용할 수 있는 DB연동에 대한 강좌를 하겠다.

 

9. 실행링크 : 여기

10. 프로그램 소스 : 여기

 

 

[코멘트] 좋음
2015-03-02 08:01
 shintx  shintx님께 메시지 보내기shintx님을 내 주소록에 추가합니다.shintx님의 개인게시판 가기 
링크가 끊겼습니다. ㅡ_ㅡ;;
저장 취소
코멘트쓰기
  좋음   놀람   궁금   화남   슬픔   최고   침묵   시무룩   부끄럼   난감
* 코멘트는 500자 이내(띄어쓰기 포함)로 적어주세요.
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.