'Windows Phone 7'에 해당되는 글 113건

  1. 2011.03.15 [wp7] 폰에서 다이렉트로 MarketPlace 접근 방법
  2. 2011.03.15 [wp7] Linq.Foreach문을 잘 활용하자.
  3. 2011.03.11 [wp7] VisualStateManager 이용하기
  4. 2011.02.23 [wp7] StoryBoard 실행중인지 아닌지와 Skip 방법
  5. 2011.02.23 [wp7] Back버튼 눌러도 아무런 반응 없게 하기 2
  6. 2011.02.18 [wp7] xml에서 특수 문자 처리
  7. 2011.02.15 [wp7] ItemsControl을 사용한 WrapPanel 사용
  8. 2011.02.10 [wp7] 이미지 Build Action 의 Content 와 Resource의 차이
  9. 2011.01.27 휴즈플로우 앱 개발 뉴스 기사 1
  10. 2011.01.07 [wp7] 효율적인 isolatedStorageSetting 사용법
  11. 2011.01.06 [wp7] Observable Collection을 이용한 바인딩
  12. 2011.01.05 [wp7] Image behind에서 바꾸기
  13. 2010.10.20 [wp7] 분리된 어셈블리에 대해서 다국어 리소스지원
  14. 2010.10.19 [wp7] Localization Resource 국제화 하는법
  15. 2010.10.18 [wp7] 람다식을 잘쓰자.
  16. 2010.10.10 [wp7] Event Handler 를 이용하여 변수가 변경되는지 감지
  17. 2010.10.08 [wp7] viewbox
  18. 2010.10.07 [wp7] behind에서 application bar 만들기
  19. 2010.10.05 [wp7] Enum 정리
  20. 2010.10.05 [wp7] 나중에 공부할것 Deployment의 Dispatcher
  21. 2010.10.04 [wp7] 기본 키패드(Number)에 . 키만 가능하게 만들기
  22. 2010.09.30 [wp7] UserControl에 간략하게 Dependency Property 쓰는법
  23. 2010.09.28 [wp7] childrun add한 UserControl 안에서 remove하기
  24. 2010.09.27 [wp7] Regex를 이용해서 숫자 형식을 바꾸어보자.(정규표현식)
  25. 2010.09.17 [wp7] 엔터키를 눌렀을때 키패드 사라지게 하기
  26. 2010.09.09 [wp7] DLL 레퍼런스 추가 할때 지정된 경로에?
  27. 2010.09.07 [wp7] Behind코드에서 폰트바꾸기
  28. 2010.09.07 [wp7] Month 입력 국제화 하기
  29. 2010.08.16 [wp7] 같은 데이터 비교했지만 메모리저장 위치가 달라서 틀리다고 나올때
  30. 2010.08.13 [wp7] 윈폰에서 전화가 울리거나 검색에 갔을때 저장?
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. 7. 12:53

그냥 무턱 대고 쓰기 보다는 이렇게 class로 정의 하는것이 효율적이다.

 

name도 const로 깔끔하게 정의 하고

 

역시 팀장님은 다른거 같다 ㅋㅋ

 

public class SettingsService
  {
      const string NormalCoinStyleKey = "NormalCoinStyle";
      const string DefaultNormalCoinType = "Basic";
 
      public SettingsService()
      {
          if (IsolatedStorageSettings.ApplicationSettings.Contains(NormalCoinStyleKey) == false)
          {
              IsolatedStorageSettings.ApplicationSettings.Add(NormalCoinStyleKey, DefaultNormalCoinType);
          }
      }
 
      public string NormalCoinStyle 
      {
          get
          {
              return IsolatedStorageSettings.ApplicationSettings[NormalCoinStyleKey] as string;
          }
          set
          {
              IsolatedStorageSettings.ApplicationSettings[NormalCoinStyleKey] = value;
              IsolatedStorageSettings.ApplicationSettings.Save();
          }
      }
  }
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. 5. 14:43
Deployment.Current.Dispatcher.BeginInvoke(delegate()
            {
                var value = Math.Round(e.X, 1) * 100;
                BallTransform.TranslateX = value;
                System.Diagnostics.Debug.WriteLine(value);
            });

 

dispatcher에 대해서 공부하자 나중에

 

그냥 dispatcher와 deployment 의 dispatcher가 어떤게 다른지 알아볼것?

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. 9. 28. 12:40

제목이 이상하다 이걸 어떻게 표현해야 하는지 모르겠다.

 

예전부터 알고 있었는데 (아마 포스팅 보면 나올듯)

 

쉬운거지만 아마 모를수도 있는사람들을 위해서 써놓자~

 

머 프로젝트에서 패널 을 하나 만들고(나는 그냥 Canvas)

 

 

TwitterLoginUserControl tl = new TwitterLoginUserControl();
ContentGrid.Children.Add(tl);
 
이렇게 add를 하고 만약 이 유저 컨트롤에 Close 버튼을 만들고 remove 를 하고 싶다면 ?
 
그렇다면  가장 쉬운방법이
 
tl.CloseBUtton.Click +=  이벤트 어쩌구 저쩌구 이렇게 만드는게 젤 쉽지만
 
코드가 지저분해진다.. 나는 딱 유저콘트롤에서 해결 하고 싶다 이러면
 
유저콘트롤에서
 
void SubmitButton_Click(object sender, RoutedEventArgs e)
{
var parentCanvas = this.Parent as Canvas;
parentCanvas.Children.Remove(this);
}

 
이렇게 하면 된다.

Posted by 동동(이재동)
Windows Phone 72010. 9. 27. 15:03

일단 regex 를 공부를 해야 하지만…

 

공부가 안되어있다면 regex 라이브러리를 이용해보자.. 하지만 나중에는 공부할것

 

데이터를 추출할때 유용하다.

 

일단 기초 공부는 여기서 시작하고

 

http://golee07.tistory.com/309

 

 

여기에서 regex 라이브러리를 참고하자

http://regexlib.com/DisplayPatterns.aspx?cattabindex=2&categoryId=3

Posted by 동동(이재동)
Windows Phone 72010. 9. 17. 15:46

윈도우7에서 텍스트 박스에 포커스가 가게 되면 키패드가 자동으로 열린다.

 

하지만 입력을 완료하고 텍스트 박스를 닫고 싶지만 닫을려면

 

“Back” 버튼을 누르던가 다른 컨트롤을 터치하여 포커스를 옮겨야만 한다.

 

“Enter”키가 있지만 나가는 버튼은 아니다. 아마 TextBox내에서 엔터 치는 기능인듯?

 

하지만 숫자같은걸 입력하는 즉 짧은 단어를 입력하고 Enter를 누르면 키패드가 닫히게 하고 싶다.

 

정말 간단하다. 하지만 약간 꼼수일수도 있고 깔끔하게 컨트롤로 만드는것도 불가능하다.

 

자 왜 컨트롤로 못 만드는지와 어떻게 하는지 알아보자.

 

일단 해당 텍스트 박스의 KeyDown 이벤트를 받아야 한다.

 

 

TaxTextBox.KeyDown += new KeyEventHandler(TaxTextBox_KeyDown);

받았으면 아래처럼 Enter키를 받고서 focus를 Page에 준다.

 

/// <summary>
/// Enter키를 눌렀을시 focus를 페이지에 주어서 키패드가 사라지게 함
/// </summary>
/// <param name="e"></param>
private void EscapeKeypad(System.Windows.Input.KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
this.Focus();
}
}

그러면 끝~

Posted by 동동(이재동)
Windows Phone 72010. 9. 9. 11:19

DLL 추가할때 조심해야 할것이 있다. 나혼차 사용할때는 상관이 없지만 TFS 나 SVN에서 같이 소스를 공유 할 경우라면

 

dll 경로를 잘맞추어주어서 올려야 한다.

 

오늘 appbox에서 쓰는 dll을 붙여서 해볼려고 했는데 내컴퓨터에서는 잘되는데 딴자리에서는 dll을 참조 할수가 없다고

 

나왔다. 왜 그런가 Dll Path를 확인하였더니 bin/ 뒤에 있는게 아닌가?

 

그래서 별 뻣짓을 다했다.

 

일단 svn에서 받은 컴퓨터에서 프로젝트 속성에서 Reference Path에 폴더를 add하면 잘되긴 하지만 정확한 해결방법이

 

아니다..

 

그렇다면 어떡해야 할까?

 

팀장님이 알려주신 방법으로는 여러가지 방법이 있지만 이렇게 해결하였다.

 

 

image

 

이렇게 폴더를 만들어 dll 파일 자체를 프로젝트에 등록하는 방법이다.

 

이렇게 해서 참조를 한후 svn Checkout을 하면 레퍼런스  Path 오류가 없어진다.

Posted by 동동(이재동)
Windows Phone 72010. 9. 7. 18:24

원래 알지만 헷갈릴수도 있으니 그냥 적는다 ㅋㅋ


FontFamily = new FontFamily("Segoe WP Light")


이렇게 string으로 써야 한다...

Posted by 동동(이재동)
Windows Phone 72010. 9. 7. 11:12

일단 폰에서 Month를 표시 하는 어플이 있는데 그냥 Month 라고 해서 “Jan”, “Feb” 이렇게 입력하면 미국에서는 잘보일

 

지 모르나 이탈리아나 프랑스 같이 다르게 쓰는 사람들은 불편할수가 있다. 그러면 어떻게 해야할까?

 

리소스로 뺴야할까? 그렇게 된다면 엄청난 노가다를 해야한다..ㅠ.ㅠ

 

일단 리스트에 모든 달을 넣어보자… 이렇게

 

for (int i = 0; i < Months.Length; i++)
            {
                Months[i] = Thread.CurrentThread.CurrentCulture.DateTimeFormat.AbbreviatedMonthNames[i];
            }
 
너무 쉽나… Thread를 이용하면 된다…
 
근데 이 Month를 Parse해야 할경우가 있다. 날짜 비교라던지 DateTime형으로 만들고 싶을때….
 
이때는 어떻게 해야할까 일단 “Jan”이라는 결과가 있는데 이걸 1로 바꾸고 싶다….
 
parse를 이용하면 되지만 날짜 형식이 일치해야 하기때문에… 강제로 그냥 만들어준다. 이게 좋은 방법인지는
 
나도 잘모르겠다 더 좋은 방법이 있으면 다시 포스팅해야겠다.
 
private int GetMonthToInt(string month)
       {            
           return DateTime.Parse(string.Format("2009/{0}/13", month)).Month;
       }
 
 
Posted by 동동(이재동)
Windows Phone 72010. 8. 16. 11:03

팀장님이 알려주신거다.. 아 역시 아직 배워야 할께 많다…

 

어떤 데이터를 비교 해야하는데(Class Type) 종료하기전에 isolatedStroage에 해당 데이터를 저장하고

 

다시 불러들일때 isolatedStroage에 있는 데이터는 같지만 메모리의 저장위치가 달라서 비교했을때

 

False로 나온다. 이때는 어떡해야 할까? foreach문으로 해당 문을 하나씩 비교 해야하나?

 

물론 비교할려면 방법은 많지만 위에 방법은 추천하지 않는다.

 

팀장님이 주신 해결방법이다.. 천재 ㄷㄷㄷ

 

비교하는 데이터 class에 equal을 override하는 방법으로 정말 간단하게 해결되었다.

 

public class CountryTitleData : INotifyPropertyChanged
    {
        bool _isChecked;
        public event PropertyChangedEventHandler PropertyChanged;
 
        public string Name { get; set; }
        public string Flag { get; set; }
        public string Code { get; set; }
        public bool Checked
        {
            get
            {
                return _isChecked;
            }
            set
            {
                if (_isChecked != value)
                {
                    _isChecked = value;
                    if (PropertyChanged != null)
                    {
                        PropertyChanged(this, new PropertyChangedEventArgs("Checked"));
                    }
                }
            }
        }
        public int FontSize { get; set; }
 
        public override bool Equals(object obj)
        {
            CountryTitleData cd =  obj as CountryTitleData;
 
            return Code == cd.Code;
        }
    }
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 동동(이재동)