'WP7'에 해당되는 글 88건

  1. 2011.03.17 [wp7] WebClient에 Parameter 주기
  2. 2011.03.15 [wp7] 웹에서 이미지를 다운받고 앱에 보여주기
  3. 2011.03.15 [wp7] 폰에서 다이렉트로 MarketPlace 접근 방법
  4. 2011.03.15 [wp7] Linq.Foreach문을 잘 활용하자.
  5. 2011.03.11 [wp7] VisualStateManager 이용하기
  6. 2011.02.23 [wp7] StoryBoard 실행중인지 아닌지와 Skip 방법
  7. 2011.02.23 [wp7] Back버튼 눌러도 아무런 반응 없게 하기 2
  8. 2011.02.18 [wp7] xml에서 특수 문자 처리
  9. 2011.02.15 [wp7] ItemsControl을 사용한 WrapPanel 사용
  10. 2011.02.10 [wp7] 이미지 Build Action 의 Content 와 Resource의 차이
  11. 2011.01.27 휴즈플로우 앱 개발 뉴스 기사 1
  12. 2011.01.06 [wp7] Observable Collection을 이용한 바인딩
  13. 2011.01.05 [wp7] Image behind에서 바꾸기
  14. 2010.10.20 [wp7] 분리된 어셈블리에 대해서 다국어 리소스지원
  15. 2010.10.19 [wp7] Localization Resource 국제화 하는법
  16. 2010.10.18 [wp7] 람다식을 잘쓰자.
  17. 2010.10.10 [wp7] Event Handler 를 이용하여 변수가 변경되는지 감지
  18. 2010.10.08 [wp7] viewbox
  19. 2010.10.07 [wp7] behind에서 application bar 만들기
  20. 2010.10.05 [wp7] Enum 정리
  21. 2010.10.04 [wp7] 기본 키패드(Number)에 . 키만 가능하게 만들기
  22. 2010.09.30 [wp7] UserControl에 간략하게 Dependency Property 쓰는법
  23. 2010.08.13 [wp7] 윈폰에서 전화가 울리거나 검색에 갔을때 저장?
  24. 2010.08.09 [wp7] Navigate를 Page Control 이외에서 하기
  25. 2010.06.29 [wp7] CommandPattern DataList의 Item Templete 안의 Button 이벤트 빼기
  26. 2010.06.15 [wp7] CommandPatton 쓰기
  27. 2010.06.15 [wp7] mvvm 쓰는법 정리
  28. 2010.06.09 [wp7] Event Handler러 대신 Callback 이용하여 return 하기
Windows Phone 72011. 3. 17. 13:25

내가 할려고 했던건

 

 

webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadComplete

d);            

 

이렇게 webclient를 이용해서 이미지 파일을 다운 받아서 isolatedFile에 저장하는거였다.

 

근데 저장하고 파라미터를 어떻게 줄까? 파일이 여러개라면 파일이름이  다 다를텐데

 

그렇다고 전역변수를 이용해서 하나씩 할당도 해볼까 했지만 잘안되었다.

 

 

private void DownloadImage(string url,string fileName)
        {            
            WebClient webClient = new WebClient();
            webClient.OpenReadAsync(new Uri(url), fileName);
            webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);            
            
        }
 
        void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
 
            string fileName = e.UserState.ToString();

 

짠 이렇게 바꾸었더니 훌륭하게 동작이 되었다.

 

webClient.OpenReadAsync(new Uri(url), fileName);
 
에 userToken을 줄수가 있었던것이다.
 
그뒤에 openReadComplete EventArgs에는 저렇게 e.UserState에서 받을수 있다.
Posted by 동동(이재동)
Windows Phone 72011. 3. 15. 17:44

이번에 할려는 일은 About 페이지에 앱 리스트를 쭉 등록시키는일이다.

 

근데 서버로부터 앱리스트를 받고 그걸 뿌려줘야 하는데 xml을 이용하기로 했다.

 

앱은 이렇게 이미지가 나와야 한다.

 

 

description등 과 같은 string이야 xml에서 받아서 파싱하면 땡이지만

 

이미지는? 그래서 테스트 어플을 하나 만들었다.

 

일단 버튼을 하나 만들고

 

Webclient로부터 이미지를 하나 다운 받게 하였다.

 

private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            var url = "http://4.bp.blogspot.com/_HfTuDK39Rv4/SAjoBeqcFtI/AAAAAAAAAbo/UaXaUjD6yTY/s400/cuty.jpg";
            //var url = "http://fc07.deviantart.net/fs27/i/2008/139/9/9/Cuty_Rabbit_by_Willow_San.jpg";
        
            WebClient webClient = new WebClient();
            webClient.OpenReadAsync(new Uri(url));
            webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
        }

 

다운로드가 완료되면

 

 

void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            var resInfo = new StreamResourceInfo(e.Result, null);
            var reader = new StreamReader(resInfo.Stream);
 
            byte[] contents;
            using (BinaryReader bReader = new BinaryReader(reader.BaseStream))
            {
                contents = bReader.ReadBytes((int)reader.BaseStream.Length);
            }            
            
            using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (isf.FileExists("file.jpg") == true)
                {
                    isf.DeleteFile("file.jpg");
                }
                IsolatedStorageFileStream  stream = new IsolatedStorageFileStream("file.jpg", FileMode.OpenOrCreate, isf);                
                stream.Write(contents, 0, contents.Length);                
                stream.Close();
                MessageBox.Show("Finish Download");
            }
        }

 

다운로드가 완료되면 file.jpg를 하나 만들어서 IsolatedStorageFile에 저장을 한다. 그전에 저렇게 StreamResouceInfo와 StreamReader로 파일을 읽는다.

 

private void Button_Click_2(object sender, RoutedEventArgs e)
       {
           using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
           {
               IsolatedStorageFileStream stream = new IsolatedStorageFileStream("file.jpg", FileMode.Open, isf);
               var image = new BitmapImage();
               image.SetSource(stream);
 
               stream.Close();
               xImage.Source = image;
           }
       }

 

자 이제 아까 저장했던 파일을 읽어서 Image Control에 출력해보자…


참고  : http://dotnet.dzone.com/articles/operating-image-files-windows?mz=27249-windowsphone7 

대충 소스 보면 알겠지만 혹시나 모르니 소스를 첨부 한다.



Posted by 동동(이재동)
Windows Phone 72011. 3. 15. 16:24

 

어떤 이벤트를 이용해 마켓플레이스에 접근하기 하는 방법이다

 

ContentIdentfier 에는 AppId를 쓰면 된다.

 

Microsoft.Phone.Tasks.MarketplaceDetailTask mt = new MarketplaceDetailTask();
mt.ContentType = MarketplaceContentType.Applications;
mt.ContentIdentifier = "d04f84f4-ea1e-e011-9264-00237de2db9e";
mt.Show();

 

참고 : http://www.wpseven.de/2010/11/link-to-windows-phone-marketplace-content/

Posted by 동동(이재동)
Windows Phone 72011. 3. 15. 12:58

보통 컬렉션 안의 컬렉션 즉 List문 안에 List문 이 있으면

 

중첩 foreach문을 쓴다.

 

그러면 코드가 길어지고 깔끔해지지가 않는다.

 

foreach (Contact _contact in contacts)
{
    _contact.ID = 0;
    _contact.GroupID = 0;
    _contact.CompanyID = 0;
}

 

이런 For문이 있을때는

 

contacts.ForEach(c => { c.ID = 0; c.GroupID = 0; c.CompanyID = 0; });

 

이렇게 바꾸면 된다.

 

만약 list안의 list를 보고 싶으면

그냥

 

_collectionBooks.Collectionbook.ToList().ForEach(i => i.Collection.ForEach( c => {CheckCollectBookSheetAllCoinCal(c);}));
 

이런식도 된다. ToList()뒤에 foreach 그리고 메소드를 만들어서 깔끔하게 돌렸다.

 

원래는 이런 for문 이였다. ㄷㄷㄷ

foreach (var item in _collectionBooks.Collectionbook)
            {
               foreach (var collect in item.Collection)
                {
         if (collect.Item != null)
            {    
                int haveCollectionCoinCount = 0;
                foreach (var coinInfo in collect.Item)
                {
                    var isHaveCollectionCoin = CollectionCoins.Where(c => c.cid == coinInfo.cid).FirstOrDefault();
                    if (isHaveCollectionCoin != null)
                    {
                        haveCollectionCoinCount++;
                    }
                }
 
                if (haveCollectionCoinCount == collect.Item.Count)
                {
                    SaveCompleteCollectBookSheetHistoryTime(collect.ID);
                }
            }
                }
            }
Posted by 동동(이재동)
Windows Phone 72011. 3. 11. 14:49

Behind에서 특정 큰트롤을 조정(예를 들면 visible)하거나 여러개의 콘트롤을 조정하여 특정 화면을 만들고 싶을때

 

스토리보드처럼 역동적이지 않고 화면을 바꾸고 싶을때 behind에서 일일히 조정하는것보다 VisualStateManager를 쓰

 

면 편하다.

 

image

 

일단 블랜드에 가서 State의 이름을 정한다. 나는 CollectionCoinState로 정했다.

 

다음에 Add State버튼을 눌러서 Add를 한다. 나는 CompleteCollect로 정했다.

 

다음 만든 CompleteCollect를 클릭하면 StoryBoard만들때처럼 Recoding On이라는 메세지와 함께 빨간줄이 쳐진다.

 

이때 자기가 만들고자 하는 상태를 만든다. 컨트롤을 숨긴다던지 아니면 보이게 한다던지

 

다 만들었으면

 

이제 이것을 실행해 보자.

 

Behind에서

 

VisualStateManager.GoToState(this, "CompleteCollect", true);                

 

이렇게 하면 아까 설정했던 상태를 그대로 적용해준다.

 

만약 State를 여러개 만들고 저기 가운데 이름만 바꾸면 여러개를 돌아가면서 바꿀수 있다.

Posted by 동동(이재동)
Windows Phone 72011. 2. 23. 15:05

스토리보드가 실행중인지 보는 메서드는

 

 

GetCurrentState()
로 알수 있다.
 
스토리보드를 Skip 하여 끝에 효과만 보게 할려면
 
SkipToFill();
 
을 쓴다.
 
예제
 
//스토리 보드가 실행중에 페이지가 넘어갈때 StoryBoard를 Skip 한다.
            if (DisappearDescriptionGuide.GetCurrentState() == System.Windows.Media.Animation.ClockState.Active)
            {
                DisappearDescriptionGuide.SkipToFill();
            }

 
Posted by 동동(이재동)
Windows Phone 72011. 2. 23. 11:40

윈폰에서 Back버튼을 눌러도 아무것도 안하거나 특정 반응을 하고 싶게 할때가 있다.

 

back 버튼을 override받아서

 

그때는 그냥 e.Canle = true;로 하면 된다.

 

이런식으로

 

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
        {
            if (dc.Content.IsDescriptionMode == true)

            {
                dc.Content.IsDescriptionMode = false;
                e.Cancel = true;
            }
        }

Posted by 동동(이재동)
Windows Phone 72011. 2. 18. 17:04

이건 wp7쪽에 써야 되는지 모르겠다.

 

html이나 여러 쪽에도 적용되는것인데

 

Name    Character    Code
quot    "                  "
amp    &                  &
apos    '                '
lt    <                     &lt;
gt    >                   &gt;

 

이렇게 쓰인다

 

근데 엔터키를 의미하는 \n을 xml에 입력하면 string값으로 \\n이 넘어오는데

 

이건 어떻게 해야 할지 몰라서

 

DescriptionTextBlock.Text = param.Replace("\\n", "\n");
 
그냥 이렇게 강제로 바꾸었다.
 
나중에 알면 수정해야겠다.

 

참조 : http://kimchulgoon.blog.me/30044443181

Posted by 동동(이재동)
Windows Phone 72011. 2. 15. 14:26

이전 포스트에서도 썻지만 이번에 Toolkit에 추가 됨으로 사용법을 알아보자

 

일단 WrapPanel을 사용하기 위해서는 wp7용 toolkit을 다운 받아야 한다.

 

그뒤에 itemsControl을 이용하여 유동으로 생성되게 하면 된다.

 

<Grid x:Name="LayoutRoot" Background="Transparent" >        
        <ScrollViewer HorizontalScrollBarVisibility="Disabled"  HorizontalAlignment="Stretch">
            <ItemsControl ItemsSource="{Binding CollectionBookData}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Border Margin="10" BorderThickness="3" Width="100" Height="150" BorderBrush="White">                                
                                <TextBlock Text="{Binding}" />
                            </Border>                            
                        </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <tk:WrapPanel />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </ScrollViewer>
    </Grid>    

 

위에 보면 알겠지만 itemsPanelTemplate에 WrapPanel을 넣었다.

 

data에는 Border로 그렸다.

 

무식하게 비하인드에서 Children.Add로 추가하지 말자

 

image

Posted by 동동(이재동)
Windows Phone 72011. 2. 10. 13:41

Resource로 했을 때는 처음에 로딩을 다 하기 때문에 속도가 느려진다.

 

그래서 웬만하면 Content로 하자…더 나은 퍼포먼스가 난다.

 

그리고 Content와 했을때와 Resource로 했을때 이미지 source를 정의 할때

 

차이점 이 있다.

 

Content로 했을때에는

 

 

<Image Stretch="None" Source="/images/appbar.cancel.rest.png"/>

 

이렇게

 

Resource로 했을때 에는

 

<Image Source="/WP7SampleProject3;component/images/appbar.feature.email.rest.png"/>

 

이렇게 정의 한다.

 

behind코드도 마찬가지이다.

 

참고

http://www.windowsphonegeek.com/tips/wp7-working-with-images-content-vs-resource-build-action

Posted by 동동(이재동)
Windows Phone 72011. 1. 27. 10:45

링크로 대신한다.


http://www.ittoday.co.kr/news/articleView.html?idxno=17454


박대표는 증강현실을 이용한 동전줍기 게임 포춘코인을 주목해 달라고 말한다.


이부분 완전 부담 100배 ㅠㅠ


더 잘만들어야겠다 ㅠㅠ


Posted by 동동(이재동)
Windows Phone 72011. 1. 6. 21:48

예전 포스트에서도 썻지만 약간 달라져서 다시 쓴다.

 

먼저 이런식으로 notifyPropertyChanged 이벤트 클래스를 하나만든다.

 

public class ItemCoinInfo : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
 
        public ItemCoinInfo()
        {
 
        }
    
        #region TypeProperty
        private ItemCoinType _type;
        /// <summary>
        /// 
        /// </summary>
        public ItemCoinType Type
        {
            get
            {
                return _type;
            }
            set
            {                
                if (value != _type)
                {
                    _type = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Type"));
                    }
                }
            }
        }
        #endregion TypeProperty            
    
        
        #region CountProperty
        private int _count;
        /// <summary>
        /// 
        /// </summary>
        public int Count
        {
            get
            {
                return _count;
            }
            set
            {
                if (value != _count)
                {
                    _count = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Count"));
                        PropertyChanged(this, new PropertyChangedEventArgs("DisplayName"));
                    }
                }
            }
        }
 
        private string _name;
        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                if (value != _name)
                {
                    _name = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Name"));
                    }
                }
            }
        }
 
        private string _displayName;
        public string DisplayName
        {
            get
            {
                _displayName = string.Format("{0} X {1}", Name, Count);
                return _displayName;
            }           
        }
 
        #endregion MyPropertyProperty                
    }
 
그뒤에는
이것을  다시
public static class ItemList
  {
      public static ObservableCollection<ItemCoinInfo> ItemsInfo { get; set; }
 
      static ItemList()
      {
          ItemsInfo = new ObservableCollection<ItemCoinInfo>();
 
          if (ItemsInfo.Count == 0)
          {
              //todo : 현재는 강제로 넣고 있지만 나중에는 xml에서 읽어올것 without count
              //초기에만 넣는다는 것을 잊으면 안됨 나중에 확장을 생각할것 -jdlee
              ItemsInfo.Add(new ItemCoinInfo { Count = 0, Type = ItemCoinType.FC1, Name = "Fortune Coin" });
              ItemsInfo.Add(new ItemCoinInfo { Count = 0, Type = ItemCoinType.PC1, Name = "Pray Coin" });
              ItemsInfo.Add(new ItemCoinInfo { Count = 0, Type = ItemCoinType.WC1, Name = "Web Coin" });
          }
      }
  }

 

이렇게 만들고

여기 안의 count개수를 이런식으로 linq로 늘리면?

//아이템 개수를 하나 늘린다.          
               var type = (ItemCoinType)Enum.Parse(typeof(ItemCoinType), viewmodel.CoinInfo.Id, true);
               (from p in ItemList.ItemsInfo where p.Type == type select p).FirstOrDefault().Count += 1;              

 

자동으로 이것을 바인딩한 컨트롤은 바뀐다.

Posted by 동동(이재동)
Windows Phone 72011. 1. 5. 13:15
난 처음에 Image를 넣어야 하는줄 알았더니 BitMapImage를 넣어야 하는것이였다.
 
사용하는 부분은 이렇게 이고
ItemImageSource = new BitmapImage(new Uri("/HugeFlow.FortuneCoins;component/Images/item/Coins_9.png", UriKind.RelativeOrAbsolute));            
 
 
 private BitmapImage _ItemImageSource;
        /// <summary>
        /// TODO:아이템 이미지 변경
        /// </summary>
        public BitmapImage ItemImageSource
        {
            get
            {
                return _ItemImageSource;
            }
            set
            {
                _ItemImageSource = value;

                OnPropertyChanged("ItemImageSource");
            }
        }
 
xaml코드에는
<Image Source="{Binding ItemImageSource}"  Stretch="Fill"/>
 
바인딩해서 사용하였다.
 
Posted by 동동(이재동)
Windows Phone 72010. 10. 20. 17:08

휴즈플로우 게시판에 올릴 내용이기 때문에 존댓말로 쓴다.~ ㅋㅋ

 

제목을 이팀장님의 말을 빌려 거창하게 썻지만 사실 별거 아닙니다~

 

ToolBox 어플은 현제 랜덤 넘버나 월드 홀리데이 같은 단일 프로그램의 dll만 추출하여 레퍼런스 참조를 하여 쓰이고 있

 

었으며 예전에는 하나의 솔루션에 각 프로그램의 프로젝트들을 로드 하여 사용하고 있었습니다.

 

하지만 하나의 솔루션에서 프로젝트를 로드 하여 deploy 하는 방법은 폰에서 사용할 때 하위 프로젝트들도 모두 depoly

 

가 되어서 폰에 10개의 어플들이 각각이 등록이 되었습니다.~ 그래서 하나의 어플만 등록되도록 프로젝트 대신 각각의 dl

 

l들 추출한 뒤 deploy 를 하여 하나의 dll로 만들어서 배포 하는 형식으로 사용했었습니다.

 

하지만 다국어 리소스 작업을  한 후 에서 각각의 dll을 추출하여 deploy를 하여 실행해보았지만 다국어 리소스 지원이 되

 

지 않았습니다. 하지만 솔루션에서 프로젝트를 로드 하여 사용된 방법에서는 작동을 잘하는 것이였습니다.

 

하지만 이것을  사용할 수가 없었던 이유가 위에서 설명한 것 와 같이 모든 프로젝트 프로그램들이 deploy가 되는 문제가

 

생기기 때문에 사용할 수 없다고 판단 하여서 dll로드 하는 방식에서 다국어 리소스를 지원 하는 방법을 찾기 위해 인터넷

 

을 마구 돌아다녔습니다 ㅠ.ㅠ 근데 윤진씨와 머리도 식힐 겸 음료수 먹으러 갔다가 해결법을 찾았습니다~(윤진씨짱)

 

생각해보면 마켓에 올리는것은 xap파일만 올리면 되는 것이기 때문에 아까 프로젝트를 로드하는 형식으로 한 방법으로

 

컴파일 한뒤 xap 파일만 폰에 로드하면 되는것이였습니다.

 

저는 항상 무조건 하나의 toolbox.dll로 만들어야 된다고만 생각하다보니 예전 방식을 고수 했던것이였죠~

 

생각의 전환이 이래서 필요하나 봅니다~^^ 물론 폰으로 디버깅이 되지는 않지만 그건 각각의 단일 솔류션에서 하면 됩니

 

다~

Posted by 동동(이재동)
Windows Phone 72010. 10. 19. 14:17

예전 WPF 시절에도 했었지만 윈폰도 똑같이 하면 된다.

 

기본국가 변경법

-폰에서 바꾸는법: 폰에서 Settings에서 region& langiage에서 display language 를 바꾼후  위에 restart 버튼을 누른다.

-프로젝트에서 바꾸는법 : 솔루션의 프로퍼티에서 Assembly Information에서 Neutral Language를 변경한다.

 

국가를 변경 하였으면 이제 리소스를 등록하자

 

일단 리소스로 빼었으면 AppResources.resx(msdn 따라서 이름지음)  에 영문 리소스가 등록되어 있을것이다.

 

여기서 영국 리소스를 한번 등록시켜보자.

 

똑같이 리소스 등록을 하는데 파일명을 AppResources.en-GB.resx 이렇게 주었다.

 

뒤에 en-GB가 붙었는데 각나라 별로 국가culture를 보고 싶으면

 

http://johnlivingstontech.blogspot.com/2010/02/localizing-resources-in-silverlight.html

 

여기를 참고하고 현재 윈폰에서 지원하는 국가는 6개 니깐 6개만 만들어 빼면 된다.

 

Deutsch(독일) de-DE

English(United Kingdom) (영국) – en-GB

english(United States) –en-US 이건 기본이니 안해도 된다. 위에 AppResources에 빼지 않았던가

espanol(스페인) es-ES

francais(프랑스) fr-FR

italiano(이탈리아) it-IT

 

자 이제 파일들을 추가 하였으면 작동하는지 보자.

 

어라? 작동을 안하네?

 

확인해보니 지원하는 국가 를 프로젝트 csproj 파일에 추가 시켜야 했다.

 

<SupportedCultures>
    en-GB;de-DE;
</SupportedCultures>

 

여기에 이런식 으로 6개를 등록시키면 제대로 동작한다.

Posted by 동동(이재동)
Windows Phone 72010. 10. 18. 15:55

자람다식을 잘쓰면 코드양을 효율적으로 줄일수 있다.

 

CountryList.ForEach(c =>
                {
                    if (c.IsChecked == true)
                    {
                        saved.Add(c.CountryCode);
                    }
                });

 

이건 기본 적인것이다.

 

반드시 List만 되는거 같다. 옵저버블이나 머 기타 Enumerator가 있는것이면 다된다고 생각했으나 안되는듯?

 

람다식에는 식 람다랑 문 람다로 나뉜다.

 

자세한건 msdn을 참고

http://msdn.microsoft.com/ko-kr/library/bb397687(VS.90).aspx

 

하지만 이런거는 직접 사용해보면서 터득하는게 제일 인거 같다.

Posted by 동동(이재동)
Windows Phone 72010. 10. 10. 17:55

일단 내가  처리해야 할 문제는 그것이였다.

 

트위터에서 로그인이 Success가 됬는지 안됐는지 체크 하는거였는데 이게 타이머로 되어있어서(LG DLLㅠ.ㅠ)

 

그래서 Success 여부를 판단하여 UI 즉 VIew딴을 바꾸는것이였다.

 

일단 Twitter Manager 클래스가 있고 거기에서 성공하면 클래스를 호출한곳(즉 VIew딴) 에서 성공이 되었는지 안되었는지  아는 방법이다.

 

즉 아주 쉽게 말해서

 

A라는 Class 가 있고 그안에 Test라는 Bool형 변수가 있는데 이것이 변경이 될때 그때 이벤트가 발생하여 알려주는것이다.

 

일단 이벤트를 발생해야 하기 때문에 살펴보자 나는 bool을 이용하였지만 샘플은 string을 이용했다(똑같다)

 

이벤트 args를 만들자

 

MyEventArgs.cs

 
    public class MyEventArgs : EventArgs
    {
        private string msg;
 
        public MyEventArgs(string messageData)
        {
            msg = messageData;
        }
        public string Message
        {
            get
            {
                return msg;
            }
            set
            {
                msg = value;
            }
        }
    }

 

 

그리고 이 이벤트를 등록하는   쿨래스를 만들자.

 

HasEvent.cs

public class HasEvent
    {
        public event EventHandler<MyEventArgs> sampleEvent;
 
        public void DemoEvent(string val)
        {
            EventHandler<MyEventArgs> temp = sampleEvent;
            if (temp != null)
            {
                temp(this, new MyEventArgs(val));
            }
        }        
    }

 

이제 SampleEvent가 등록되었으니 일반 이벤트랑 똑같이 쓰면 된다~ 와우

 

이 이벤트를 사용하는 예제를 보자

 

MainPage.cs

 

public partial class MainPage : PhoneApplicationPage
   {
       // Constructor
       public MainPage()
       {
           InitializeComponent();
           HasEvent he = new HasEvent();
           he.sampleEvent += new EventHandler<MyEventArgs>(he_sampleEvent);
           he.DemoEvent("true");            
       }
 
       void he_sampleEvent(object sender, MyEventArgs e)
       {
           MessageBox.Show(e.Message);
       }
   }

 

이렇게 이벤트를 줘서 만약 내가 어떤 시기에 특정 메소드를 실행시키고 싶거나 변경하고 싶다면

 

이렇게 이용하면 된다.

 

참고  :  http://msdn.microsoft.com/ko-kr/library/db0etb8x.aspx

'Windows Phone 7' 카테고리의 다른 글

[wp7] Localization Resource 국제화 하는법  (0) 2010.10.19
[wp7] 람다식을 잘쓰자.  (0) 2010.10.18
[wp7] viewbox  (0) 2010.10.08
[wp7] behind에서 application bar 만들기  (0) 2010.10.07
[wp7] Enum 정리  (0) 2010.10.05
Posted by 동동(이재동)
Windows Phone 72010. 10. 8. 22:03


윈폰의 viewbox가 없어서 남이 만들어논걸 쓴다 ㅋㅋ

http://blogs.imeta.co.uk/nrees/archive/2010/06/29/viewbox-wrappanel-and-a-scalable-ui-for-windows-phone-7.aspx


링크로 대신하자.;;

Posted by 동동(이재동)
Windows Phone 72010. 10. 7. 17:09

private void CreateApplicationBar()
{
    ApplicationBar = new ApplicationBar();
    ApplicationBar.IsVisible = true;
    ApplicationBar.IsMenuEnabled = false;
 
    ApplicationBarIconButton apDoneButton = new ApplicationBarIconButton(new Uri("icons/appbar.check.rest.png", UriKind.Relative));
    apDoneButton.Text = "Done";
    apDoneButton.Click += new EventHandler(apDoneButton_Click);
 
    ApplicationBarIconButton apCancelButton = new ApplicationBarIconButton(new Uri("icons/appbar.cancel.rest.png", UriKind.Relative));
    apCancelButton.Text = "Cancel";
    apCancelButton.Click += new EventHandler(apCancelButton_Click);
 
    ApplicationBar.Buttons.Add(apDoneButton);
    ApplicationBar.Buttons.Add(apCancelButton);
 
}

 

시간이 없으므로 소스로 대신한다.

Posted by 동동(이재동)
Windows Phone 72010. 10. 5. 14:49
/// <summary>
/// SNS Type 정의
/// </summary>
   public enum SnsType
   {
       Facebook,
       Twitter,
   };

 

 

이렇게 쓰는방법이랑

 

뒤에 facebook 에 정의를 쓰는방법이 있다.

 

만약 현재 string을 enum 형식으로 변환하고 싶으면 이렇게 하면 되고

YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString);

만약 이렇게 int형식으로 바꾸고 싶을때는 
 
 public enum RouteTypeName     {         RouteTypeDirect = 1,         RouteTypeTransfer = 2     }

그냥 이렇게 형변환 하면 된다.

(int)ReserveInfoModel.radJobId


Posted by 동동(이재동)
Windows Phone 72010. 10. 4. 17:21

현제 기본적으로 inputScop를 지원하는 유일한 Numberic 키패드는 TelephoneNumber이다.(머 추후 업데이트 되겠지 )

 

먼저 Number키패드에는 . 만 있는게 아니라 ‘ 라든지 있다.

 

나는 . 만 입력되게 하고 싶었지만 아예 .키가 동작을 하지 않았다… 더 억울한 상황 ㅠ.ㅠ

 

그래서 TextBox 를 상속받아서 override해서 해결하였다.

 

일단 전체 소스를 보자

 

 
using System.Globalization;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using SalePrice.Views;
using System;
 
namespace SalePrice.Controls
{
    public class FormattedTextBox : TextBox
    {
        public enum NumberType
        {
            Number,
            Double,
            Integer,
            Currency
        };
 
        public string FormattedText
        {
            get { return (string)GetValue(FormattedTextProperty); }
            set { SetValue(FormattedTextProperty, value); }
        }
 
        public static readonly DependencyProperty FormattedTextProperty =
            DependencyProperty.Register("FormattedText", typeof(string), typeof(FormattedTextBox), new PropertyMetadata(string.Empty));
 
        public double Number
        {
            get { return (double)GetValue(NumberProperty); }
            set { SetValue(NumberProperty, value); }
        }
 
        public static readonly DependencyProperty NumberProperty =
            DependencyProperty.Register("Number", typeof(double), typeof(FormattedTextBox), new PropertyMetadata(double.NaN, onNumberPropertyChanged));
 
        protected static void onNumberPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            FormattedTextBox ftb = d as FormattedTextBox;
            ftb.onNumberChanged((double)e.OldValue, (double)e.NewValue);
        }
 
        public NumberType Type
        {
            get { return (NumberType)GetValue(TypeProperty); }
            set { SetValue(TypeProperty, value); }
        }
 
        public static readonly DependencyProperty TypeProperty =
            DependencyProperty.Register("Type", typeof(NumberType), typeof(FormattedTextBox), new PropertyMetadata(NumberType.Double, onTypePropertyChanged));
 
        protected static void onTypePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            FormattedTextBox ftb = d as FormattedTextBox;
            ftb.onTypeChanged((NumberType)e.OldValue, (NumberType)e.NewValue);
        }
 
        private Regex _regex = null;
        private string _lastSuccess = string.Empty;
        private int _prevPos = 0;
 
        public FormattedTextBox()
        {
            DefaultStyleKey = typeof(FormattedTextBox);
            TextChanged += onTextChanged;
            InputScope = new InputScope();
            //InputScope.Names.Add(new InputScopeName(){ NameValue= InputScopeNameValue.CurrencyAmount});
            InputScope.Names.Add(new InputScopeName() { NameValue = InputScopeNameValue.TelephoneNumber });
 
        }
 
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            setType(Type);
            updateFormattedText();            
       }
 
        protected override void OnManipulationCompleted(ManipulationCompletedEventArgs e)
        {
            base.OnManipulationCompleted(e);
            this.Focus();
        }
 
        private void setType(NumberType type)
        {
            switch (type)
            {
                case NumberType.Double:
                case NumberType.Currency:
                    _regex = new Regex(@"^\d+\.?\d*?$");
                    //_regex = new Regex(@"^(((\d{1,3})(,\d{3})*)|(\d+))(.\d+)?$");
                    break;
                case NumberType.Number:
                case NumberType.Integer:
                    _regex = new Regex(@"^\d+$");
                    //_regex = new Regex(@"^\d+$");                    
                    break;
            }
        }
 
        private void updateFormattedText()
        {
            if (string.IsNullOrEmpty(Text) == true || _regex == null)
                return;
 
            if (_regex.Match(Text).Success == false)
            {
                Text = _lastSuccess;
                SelectionStart = _prevPos;
            }
 
            double num = 0;
            double.TryParse(Text, out num);
 
            switch (Type)
            {
                case NumberType.Double:
                    {
                        Number = num;
                        FormattedText = Text;
                    }
                    break;
                case NumberType.Integer:
                    {
                        Number = (int)num;
                        FormattedText = Text;
                    }
                    break;
                case NumberType.Currency:
                    {
                        Number = num;
                        //FormattedText = string.Format("{0:C}", Number);
                        FormattedText = string.Format("{0:N}", Number);
                    }
                    break;
            }            
        }
 
        private void onTextChanged(object sender, TextChangedEventArgs e)
        {
            if (string.IsNullOrEmpty(Text) == true)
            {
                Number = 0;
                SelectAll();
                SelectionStart = 0;
            }
            updateFormattedText();
        }
        
 
        protected virtual void onNumberChanged(double oldValue, double newValue)
        {
            string old = Text;         
            Text = newValue.ToString();
 
            if (Text != old)
            {
                SelectionStart = _prevPos;
            }
        }
 
        protected virtual void onTypeChanged(NumberType oldValue, NumberType newValue)
        {
            setType(newValue);
            updateFormattedText();
        }
 
        protected override void OnGotFocus(RoutedEventArgs e)
        {
            base.OnGotFocus(e);
 
            SelectAll();
            SelectionStart = 0;
        }
 
       
        protected override void OnKeyDown(KeyEventArgs e)
        {            
            _lastSuccess = Text;
            _prevPos = SelectionStart;
           
            switch (e.Key)
            {
                case Key.D0:
                case Key.D1:
                case Key.D2:
                case Key.D3:
                case Key.D4:
                case Key.D5:
                case Key.D6:
                case Key.D7:
                case Key.D8:
                case Key.D9:
                case Key.NumPad0:
                case Key.NumPad1:
                case Key.NumPad2:
                case Key.NumPad3:
                case Key.NumPad4:
                case Key.NumPad5:
                case Key.NumPad6:
                case Key.NumPad7:
                case Key.NumPad8:
                case Key.NumPad9:
                case Key.Decimal:
                case Key.Delete:
                case Key.Back:
                case Key.Left:
                case Key.Right:
                case Key.Enter:                
                case Key.Tab:
                    {
                        base.OnKeyDown(e);
                    }
                    break;
                default:
                    {
                        //"."키의 keycode로 구분해서 사용 가능하게 만든다.
                        if (e.PlatformKeyCode == 190)
                        {
                            base.OnKeyDown(e);
                        }
                        else
                        {
                            e.Handled = true;
                        }                        
                    }
                    break;
            }
        }
    }
}
 


key 다운에 보면 주석으로 달아놓았다 ㅋㅋ

Posted by 동동(이재동)
Windows Phone 72010. 9. 30. 17:52

먼저 UserControl을 이용하여 Dependecy Property를 쓴 간략한 예제를 먼저 보자

<UserControl x:Class="WorldHoliday.Views.HolidayText"
 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 
    mc:Ignorable="d"
 
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
 
    FontSize="{StaticResource PhoneFontSizeNormal}"
 
    Foreground="{StaticResource PhoneForegroundBrush}"
 
    x:Name="RootText"
 
    >    
 
    <StackPanel>
 
        <TextBlock Text="{Binding Path=HolidayTextValue,ElementName=RootText}" VerticalAlignment="Center"/>
 
        <Path Data="M0,52 L480.02109,52" Fill="#FFF4F4F5" Height="1" Margin="0,0,-1.021,7" Stretch="Fill" Stroke="White" UseLayoutRounding="False" VerticalAlignment="Bottom"/>
 
    </StackPanel>
 
</UserControl>
 
 

 

그냥 usercontrol에 Textbox 하나 넣은 것이다. 이미 구현된 완성본을 넣었다. 일단 완성 해 놓고 시작을 했다.

 

자 이제 behind코드를 보자.

public partial class HolidayText : UserControl
 
   {
 
       public string HolidayTextValue
 
       {
 
           get { return (string)GetValue(HolidayTextValueProperty); }
 
           set { SetValue(HolidayTextValueProperty, value); }
 
       }
 
 
       public static readonly DependencyProperty HolidayTextValueProperty =
 
          DependencyProperty.Register("HolidayTextValue", typeof(string), typeof(HolidayText), new PropertyMetadata(string.Empty));
 
 
 
 
       public HolidayText()
 
       {
 
           InitializeComponent();            
 
       }
 
   }

 

그냥 간단하게 넣은것이다.

 

약간 설명을 하자면

Name = 등록할 속성의 이름

Propeprty=  속성의 타입

ownerType = 속성을 포함한 부모의 타입

typeMetaData = 속성 메타데이타 지정 (보통 callback 함수를 지정함)

 

마지막은 null로 지정가능하고 필요에 따라서 call back 함수를 만들어서 사용할수도 있다. 자세한 설명은

 

http://drum-83.tistory.com/82

 

여기를 참조 하자

 

자 이제 이 유저컨트롤을 사용한 코드를 보자

 

HolidayText ht = new HolidayText()
 
{
 
    HolidayTextValue = day
 
}; 
 
 
HolidayMonthList.Children.Add(ht);

 

자 이제 이 간단한 코드를 자세히 살펴보자..

 

이건 HolidayText라는 유저 컨트롤에 HolidayTextValue라는 Dependency Property를 정의 하고 그냥 string형 값을

 

주면 usercontrol안의 TextBlock에 내용을 뿌려주는 것이다.

 

중요한 건 저렇게 Dependency Property를 주는데 꼭 ElementName을 줘야 한다는 것이다 중요!!!!

 

<TextBlock Text="{Binding Path=HolidayTextValue,ElementName=RootText}" VerticalAlignment="Center"/>

 

이부분에서 ElementName은 위에 UserControl에 x:Name="RootText" 이렇게 정의 하였다…

 

만약 ElementName을 주지 않는다면 바인딩이 제대로 되지 않으므로 주의 하자

 

참고 : http://decav.com/blogs/andre/archive/2007/05/27/wpf-binding-to-properties-in-your-usercontrol-or-window.aspx <—elementName의 중요성

Posted by 동동(이재동)
Windows Phone 72010. 8. 13. 16:16

윈도우폰을 사용중에  전화가 오거나 빙검색을 하기 위해 서치 버튼을 눌렀다가 다시 원래 화면으로 돌아온다면?

모든 텍스트 박스나 바인딩이 초기 값으로 세팅해져있을것이다.

예를들면 랜덤넘버 프로그램에서 최소값 3과 최대값 300을 썻는데  빙검색을 누르거나 전화를 받았거나 문자를 받았다면

사용자는 자기가 하고 있던값이 사라지면 황당할것이다.

다행히 파일에 저장하는 IsolatedStorage가 있지만 우리는 영원히 저장하는것이 아니라 잠시 전화가 오기전의 상태를 저

장하기를 원한다.

우리가 그 상태정보를 영원히 가지고 있을 필요가 없다는것이다.

 

그렇다면 IsolatedStorage도 좋은 선택이 아니다.

 

PhoneApplicationService.Current.State

 

이걸 쓰면 어떨까? 이건 사용법은 isolatedStroage와 같지만 다른점은 어플이 종료가 될때는 사라진다는점이다.

즉 종료하지 않고 어떤 다른곳 으로 네비게이션을 하게 된다면 여기 데이터는 계속 살아있지만 종료를 하면 없어지기때문에 현재 상태를 파일에 쓰는것 보다 더 나은 성능 향상과 메모리 사용률 최적화를 기대할수 있다.

 

이걸 적용하기 위해서 네비게이션을 이동하기 전에 실행되는 함수와 이동이 되었을때 실행이 되는 함수에 넣으면 된다.

 

먼저 이동전에 현제 상태를 PhoneApplicationService.Current.State에 저장한다.

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
    RandomNumberStateData _randomNumberStateData = new RandomNumberStateData();
    _randomNumberStateData.TextBoxStart = StartNumberText.Text;
    _randomNumberStateData.TextBoxEnd = EndNumberText.Text;
    _randomNumberStateData.ButtonRandomNumber = button.Content.ToString();            
    
    if (PhoneApplicationService.Current.State.ContainsKey("RandomNumberState") == true)
    {
        PhoneApplicationService.Current.State.Remove("RandomNumberState");             
    }
 
    if (e.Content == null)
    {
        PhoneApplicationService.Current.State.Add("RandomNumberState", _randomNumberStateData);
    }
}

 

이렇게 저장을 하였으면  이제 볼일을 보고 다시 왔을때 이 상태 값들을 다시 원래 대로 복원을 해줘야 한다.

 

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
       {
           var dc = this.DataContext as RandomNumberViewModel;
           dc.ShakeSenserStart();
 
           if (PhoneApplicationService.Current.State.ContainsKey("RandomNumberState") == true)
           {
               var randomNumberStateData = PhoneApplicationService.Current.State["RandomNumberState"] as RandomNumberStateData;                
               dc.MinNumberValue = randomNumberStateData.TextBoxStart;
               dc.MaxNumberValue = randomNumberStateData.TextBoxEnd;
               dc.RandomNumberValue = randomNumberStateData.ButtonRandomNumber;
               //button.Content = randomNumberStateData.ButtonRandomNumber;                
           }
       }

 

큰 어려움은 없다 . 

참고 : http://windowsteamblog.com/windows_phone/b/wpdev/archive/2010/07/20/understanding-the-windows-phone-application-execution-model-tombstoning-launcher-and-more-part-3.aspx

Posted by 동동(이재동)
Windows Phone 72010. 8. 9. 16:33

MVVM을 쓰면서 페이지 이동을 할때에는 꼭 Page 에서 해야만 했다.


즉 뷰딴에서만 이동이 가능했다.


예를 들면

var uri = new Uri(string.Format("/TypenWork;component/Views/OptionPage.xaml"), UriKind.RelativeOrAbsolute);
NavigationService.Navigate(uri);

이렇게 하여야만 했지만


그래서 꼭 behind딴에서 코딩을 하여 mvvm 고유의 깔끔함이 없어졌다.


하지만 페이지 이동을 딴 곳 즉 ViewModel 이나 Model쪽에서 하고 싶을때가 많다(거의 90%)


그럴때는 어떻게 할까... 언제까지 datacontext를 형변환 하여 사용할것인가?


팀장님이 발견한 방법이다


var temp = App.Current.RootVisual as PhoneApplicationFrame;
temp.Navigate(new Uri("/UnitConverter;component/Views/MainListView.xaml",UriKind.RelativeOrAbsolute));


이렇게 app의 RootVisual를 PhoneApplicationFrame을 캐스팅하여 사용하는 방법이다 굿~^^


이제 자유롭게 어디서든 Navigate 를 사용할수 있다.

Posted by 동동(이재동)
Windows Phone 72010. 6. 29. 10:43

점점 mvvm에 대해서 아는것 같다…

일반 컨트롤의 이벤트는 command를 이용해서 빼는것은 이제 조금씩 익숙해지고 있다.

하지만 ListBox안의 Template에서 이벤트를 빼야 한다면? 자 해보자

<ListBox x:Name="SearchCountryListBox" ItemsSource="{Binding SearchCountryListBoxItemSource}" Height="240">
 
                   <ListBox.ItemTemplate>
 
                       <DataTemplate>
 
                           <Grid>
 
                               <Grid.ColumnDefinitions>
 
                                   <ColumnDefinition Width="Auto" />
 
                                   <ColumnDefinition Width="*" />
 
                                   <ColumnDefinition Width="Auto" />
 
                               </Grid.ColumnDefinitions>
 
                               <Image Source="{Binding Flag}"  Width="80" Height="50" Grid.Column="0" />
 
                               <TextBlock Text="{Binding Name}"  FontSize="35" Grid.Column="1" Margin="40,0,40,0"/>
 
                               <Button x:Name="button" Content="button "  Grid.Column="2" >
 
                                   <i:Interaction.Behaviors>
 
                                       <HugeFlow_CommandPattern_Interactivity:ExecuteAncestorInstantCommandBehavior CommandName="SearchCountrySelectButtonCommand">
 
                                           <i:Interaction.Triggers>
 
                                               <i:EventTrigger SourceName="button" EventName="Click">
 
                                                   <i:InvokeCommandAction CommandName="CommandTriggers"/>
 
                                               </i:EventTrigger>
 
                                           </i:Interaction.Triggers>
 
                                       </HugeFlow_CommandPattern_Interactivity:ExecuteAncestorInstantCommandBehavior>
 
                                   </i:Interaction.Behaviors>
 
                               </Button>
 
                           </Grid>
 
                       </DataTemplate>
 
                   </ListBox.ItemTemplate>
 
               </ListBox>
 
 




 




보이는가? 버튼에 command pattern 적용한것을?



이렇게 만들려면 치는거보다 블랜드에서 하는게 편하다…



 



 



 



 





해당 listbox item template에 들어가서



 



 



 



일단 ExecuteAncestorInstatntCommandBehavior를 더블 클릭하여 만든다.





여기서 부턴 일반 commandPattern이랑 같으니까 생략~


아 그리고 중요한건 블랜드에서 CommandName을 쓸때 수동으로 쓸수 밖에 없다 DataBinding이 뜨지 않기때문에

만든 커맨드 이름을 쓰면 된다.^^

Posted by 동동(이재동)
Windows Phone 72010. 6. 15. 15:47

일단 처음에 해야할것은

역시 HugeFlow dll 레퍼런스에 로드 하고 ViewModel에 을 상속받아서 쓴다.

일단 코드를 보자~

#region StartButtonCommand
       /// <summary>
       /// StartButton InstantCommand for ViewModel
       /// </summary>
       private ICommand _StartButtonCommand;
       public ICommand StartButtonCommand
       {
           get
           {
               return _StartButtonCommand;
           }
           set
           {
               _StartButtonCommand = value;
               OnPropertyChanged("StartButtonCommand");
           }
       }
 
       public void StartButton(object param)
       {
             // code here
       }
       #endregion StartButtonCommand
 
 


code snipper를 이용하면 ic 를 입력하면 instantCommand를 이용할수 있다.



그리고 생성자에



 
public RandomNumberViewModel()
       {
           StartButtonCommand = new InstantCommand<object>(StartButton);
           //StartRandomCommand = new InstantCommand<string>(StartRandom);
       }
 
 


이렇게 넣어주면 땡~



xaml에서는



 
<phoneNavigation:PhoneApplicationPage
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Navigation"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone.Shell"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"    
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:HugeFlow_CommandPattern_Interactivity="clr-namespace:HugeFlow.CommandPattern.Interactivity;assembly=HugeFlow.MVVM" 
    x:Class="RanDomNumber.MainPage"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"    
    x:Name="phoneApplicationPage" 
    DataContext="{Binding RandomNumberViewModel, Source={StaticResource ServiceLocator}}"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}">
    <i:Interaction.Behaviors>
        <HugeFlow_CommandPattern_Interactivity:ExecuteInstantCommandBehavior x:Name="StartButtonCommand" Command="{Binding StartButtonCommand}">
            <i:Interaction.Triggers>
                <i:EventTrigger SourceName="TestButton" EventName="Click">
                    <i:InvokeCommandAction CommandName="CommandTriggers"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </HugeFlow_CommandPattern_Interactivity:ExecuteInstantCommandBehavior>
    </i:Interaction.Behaviors>
 
 


보면 알겟지만



xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:HugeFlow_CommandPattern_Interactivity="clr-namespace:HugeFlow.CommandPattern.Interactivity;assembly=HugeFlow.MVVM"



를 추가하고



블랜드를 이용하여



<i:Interaction.Behaviors>

        <HugeFlow_CommandPattern_Interactivity:ExecuteInstantCommandBehavior x:Name="StartButtonCommand" Command="{Binding StartButtonCommand}">


            <i:Interaction.Triggers>


                <i:EventTrigger SourceName="TestButton" EventName="Click">


                    <i:InvokeCommandAction CommandName="CommandTriggers"/>


                </i:EventTrigger>


            </i:Interaction.Triggers>


        </HugeFlow_CommandPattern_Interactivity:ExecuteInstantCommandBehavior>


    </i:Interaction.Behaviors>



이 구문을 만들었다 블랜드를 이용해서 만드는 방법을 알아보자~



silverlight 4 rc 버전을 이용했다(정식버전은 아직 지원안됨 이것떄문에 지웠다 다시깜 ㅠㅠ)





 



그냥 간단하게 보자



위에서부터 Asset-ExucteInstantCommand-그리고 커맨드가 생기면 커맨드 클릭한후 event trriger 등록 하고 숨겨진창을



클릭하여 SourceName을 선택한후  마우스로 컨트롤을 선택하고 Command에 가서 icommand 가 있는 메소드를 선택하면 된다.



마지막으로 x:name 즉 이름 넣는곳에 알기 쉽게 아까 만든거와 같은 커맨드 네이밍을 입력하자



여기서는 StartButtonCommand~

Posted by 동동(이재동)
Windows Phone 72010. 6. 15. 10:44

 

일단 설명은 나중에 하고 설명부터 하자….(레퍼런스에 hugeflow.mvvm 이랑 core dll 넣는것은 기본~)

일단 ViewModels라는 폴더(안만들어도 상관없음)를 만들고 class를 만들자 예를들어 RandomNumberView.model.cs

그뒤에 Service locator를 등록하자

serviceLocator.cs 를 만들고

이렇게….

namespace RanDomNumber
{
    public class ServiceLocator
    {
        RandomNumberViewModel _randomNumberViewModel;
 
        public RandomNumberViewModel RandomNumberViewModel
        {
            get
            {
                _randomNumberViewModel = new RandomNumberViewModel();
                return _randomNumberViewModel;
            }
        }
    }
}
 
 


그리고 xaml MainPage에 등록하기전에 App.xaml에서 리소스를 추가시킨다.



 



 
<Application 
    x:Class="RanDomNumber.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"       
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:system="clr-namespace:System;assembly=mscorlib"
    xmlns:local="clr-namespace:RanDomNumber"
    xmlns:mpc="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
    xmlns:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Navigation">
    
    <!--RootFrame points to and loads the first page of your application-->
    <Application.RootVisual>
        <phoneNavigation:PhoneApplicationFrame x:Name="RootFrame" Source="/MainPage.xaml"/>
    </Application.RootVisual>
 
    <!-- Resources for following the Windows Phone design guidelines -->
    <Application.Resources>
        <!--************ THEME RESOURCES ************-->        
        <local:ServiceLocator x:Key="ServiceLocator" />
        <!-- Color Resources -->
 
 


xmlns:local="clr-namespace:RanDomNumber"



<Application.Resources>

       <!--************ THEME RESOURCES ************—>        
       <local:ServiceLocator x:Key="ServiceLocator" />



이렇게 추가하면



MainPage.xaml에서



 
 
    x:Class="RanDomNumber.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phoneNavigation="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Navigation"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone.Shell"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"    
    DataContext="{Binding Source={StaticResource ServiceLocator},Path=RandomNumberViewModel}"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}">
 
 


DataContext="{Binding Source={StaticResource ServiceLocator},Path=RandomNumberViewModel}"



이거를 추가해주면 된다.



 



브레이크 포인터를 ServicerLocator에서 걸어서 꼭 확인해보자.. 안되면 xaml에 잘못 쓰거나 이름을 다르게 썻을 경우이다.









자이제 아까 만든 RandomNumberView.model.cs 에 소스를 붙여 넣어보자…



 
namespace RanDomNumber.ViewModels
{
    public class RandomNumberViewModel : ViewModelBase
    {
        public RandomNumberViewModel()
        {
            
        }
 
        private string _StartNumberValue = "30";
        private string _EndNumberValue = "100";
        private string _countNumberValue = "2";
 
        public string StartNumberValue
        {
            get
            {
                return _StartNumberValue;
            }
            
            set
            {
                if (_StartNumberValue != value)
                {
                    _StartNumberValue = value;
                }
            }            
        }
 
        public string EndNumberValue
        {
            get
            {
                return _EndNumberValue;
            }
 
            set
            {
                if (_EndNumberValue != value)
                {
                    _EndNumberValue = value;
                }                
            }
        }
 
        public string CountNumberValue
        {
            get
            {
                return _countNumberValue;
            }
 
            set
            {
                if (_countNumberValue != value)
                {
                    _countNumberValue = value;
                }                      
            }
        }        
    }
}
 
 








이렇게  modelview를 작성해서 바인딩할 값을 넣어보자.샘플로~



이제 바인딩할 컨트롤에 적용해보자…




<TextBlock Text="Start"  Grid.Row="0"/>
<TextBox x:Name="StartNumberText" Text="{Binding StartNumberValue}" Grid.Row="1" />
<TextBlock Text="End" Grid.Row="2" />
<TextBox x:Name="EndNumberText" Text="{Binding EndNumberValue}" Grid.Row="3" />
<TextBlock Text="Count" Grid.Row="4" />
<TextBox x:Name="CountNumberText" Text="{Binding CountNumberValue}" Grid.Row="5" />





 



그러면 이렇게 보일것이다.



 





 



끝~ 다음은 커맨트 패턴~

Posted by 동동(이재동)
Windows Phone 72010. 6. 9. 16:38
아까랑 다르게 이번에는 callback을 이용해서 해보겠다....

소스코드가 이상하게 올라가서 이제부터 <pre>태그를 써서 올려야겠다 ㅡ.ㅡ;;

 


 
public MainPage()
        {
            InitializeComponent();
 
            SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;
            Download.start(onStartComplete);                        
        }
 
        private void onStartComplete(string value, Exception ex)
        {
            Debug.WriteLine(value);
        }
 
 
 






일단 알아보기 쉽게 아까 소스를 재사용(?) 했다.





역시 download class가 있고 거기서 webClient에서 다운받은 웹소스를 저장혹은 출력하는것이다.







헉 더 간단하다. 그냥 onStartComplete 메소드 하나 만들어서 파라미터로 값을 넣는다.







사실 이것보다 이것을 먼저 봐야 할것이다.







download.cs



 
public class Download
    {
        public static void start(Action<string,Exception> callback)
        {
            WebClient webRequest = new WebClient();
            var apiURI = new Uri("http://www.google.co.kr", UriKind.RelativeOrAbsolute);
 
            webRequest.DownloadStringAsync(apiURI);
            webRequest.DownloadStringCompleted += (s, e) =>
                {
                    string value = "Good Data"; //보낼데이타 e를 보내도 됨
                    callback(value, null);
                };
        }
    }
 
 
 



코드가 한결 가벼워졌다...
</STRING,EXCEPTION>보면 Action 이라는것을 이용해서 값이랑 exception을 받고 DownloadCompete 시에 저 데이터를 callback 하는것이다.

이것도 말보다는 직접 소스를 보는게 나을것이다.

샘플소스

</STRING,EXCEPTION>[#FILE|Call_Back_Sample.zip|pds/201006/09/37/|mid|0|0|pds20|0#]


</STRING,EXCEPTION></STRING,EXCEPTION>
Posted by 동동(이재동)