'분류 전체보기'에 해당되는 글 653건

  1. 2011.05.27 [wp7] Toast Notification 만드는법 2 (Mango Ver) 1
  2. 2011.05.27 [WP7] Toast Notification 만드는법 1 (Mango Ver)
  3. 2011.05.27 [surface] surface 런칭쇼에 내가 만든 프로그램 공개
  4. 2011.05.27 [Surface] FlowDocument 사용하기
  5. 2011.05.19 [surface] WPF에서 VisualState 쓰기
  6. 2011.05.17 [WCF] WCF REST service project 만드는법
  7. 2011.05.03 [wp7] Customizing WP7 Push Notification Tiles
  8. 2011.04.26 [wp7] 모바일 앱에 광고 탑재하는법 2
  9. 2011.04.25 [wp7] 폰에서 유니크한 ID 만들기
  10. 2011.04.22 [wp7] 자기가 사용하는 기계 Model명을 얻고 싶을때
  11. 2011.03.31 [wp7] MVVM에서의 Invalid cross-thread access.메세지
  12. 2011.03.31 [wp7] Command를 Behind에서 사용하자
  13. 2011.03.25 [wp7] 윈도우 폰 캡쳐 프로그램
  14. 2011.03.24 [wp7] 어셈블리로부터 버전 정보 받아오기
  15. 2011.03.24 [WP7] 페이지 이동간의 파라미터 주기
  16. 2011.03.21 [wp7] Control 만들기
  17. 2011.03.21 [wp7] Control 만들때 generic.xaml 에서 Converter 쓰기
  18. 2011.03.21 [wp7] WebClient에서 Caching 문제로 갱신이 되지 않을 때…
  19. 2011.03.18 [생활] 다이어트 속설
  20. 2011.03.17 [wp7] WebClient에 Parameter 주기
  21. 2011.03.15 [wp7] 웹에서 이미지를 다운받고 앱에 보여주기
  22. 2011.03.15 [wp7] 폰에서 다이렉트로 MarketPlace 접근 방법
  23. 2011.03.15 [wp7] Linq.Foreach문을 잘 활용하자.
  24. 2011.03.11 [wp7] VisualStateManager 이용하기
  25. 2011.03.08 [util] 파일 검색 종결자 툴
  26. 2011.02.23 [wp7] StoryBoard 실행중인지 아닌지와 Skip 방법
  27. 2011.02.23 [wp7] Back버튼 눌러도 아무런 반응 없게 하기 2
  28. 2011.02.18 [wp7] xml에서 특수 문자 처리
  29. 2011.02.16 [vs] Visual Studio에서 내가 유용하게 쓰는 Extensions
  30. 2011.02.15 [wp7] ItemsControl을 사용한 WrapPanel 사용
Windows Phone 72011. 5. 27. 18:31

그냥 여러개로 나누어서 적어보았다.. ㅋㅋ 웬지 그게 더 멋있어 보여서 (헐…)

 

요즘엔 다 이렇게 하더라 ㅋㅋ

자 이제 윈폰 클라이언트 프로그램을 만들어보자..

 

일단 윈폰 프로젝트를 열고

 

private HttpNotificationChannel httpChannel;
  const string channelName = "TestAppUpdatesChannel";
  // Constructor
  public MainPage()
  {
      InitializeComponent();
 
      //Create the channel
 
      //만약 채널이 이미 있으면 
      httpChannel = HttpNotificationChannel.Find(channelName);
 
      //이벤트 등록
      if (httpChannel == null)
      {
          httpChannel = new HttpNotificationChannel(channelName, "HugeFlowAppTestService");
          httpChannel.Open();
          httpChannel.BindToShellToast();
      }           
 
      SubscribeToChannelEvents();
      SubscribeToService();
      
  }

 

채널을 등록하고 open하고 bind 한다.

bindToshellToast()는 망고버전에 나온 좋은 기능이다 더 편리해졌다 ㅋ

 

만약 이미 등록되어있다면

그냥 이벤트만 연결하고 클라이언트 URI를 서버에 전달한다.

 

private void SubscribeToChannelEvents()
       {
           httpChannel.ChannelUriUpdated += new EventHandler<NotificationChannelUriEventArgs>(httpChannel_ChannelUriUpdated);
           httpChannel.ShellToastNotificationReceived += new EventHandler<NotificationEventArgs>(httpChannel_ShellToastNotificationReceived);
       }

 

이렇게 이벤트 연결하고

void httpChannel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
       {
           StringBuilder message = new StringBuilder();
           string relativeUri = string.Empty;
 
           message.AppendFormat("Received Toast {0}:\n", DateTime.Now.ToShortTimeString());
 
           // Parse out the information that was part of the message.
           foreach (string key in e.Collection.Keys)
           {
               message.AppendFormat("{0}: {1}\n", key, e.Collection[key]);
 
               if (string.Compare(
                   key,
                   "wp:Param",
                   System.Globalization.CultureInfo.InvariantCulture,
                   System.Globalization.CompareOptions.IgnoreCase) == 0)
               {
                   relativeUri = e.Collection[key];
               }
           }
 
           // Display a dialog of all the fields in the toast.
           Dispatcher.BeginInvoke(() => MessageBox.Show(message.ToString()));
       }
       

 

이건 이제 메세지를 받았을때 프로그램에 보여주기 위한 이벤트이다. 메세지를 받았을때 메세지 박스로 띄워준다.

 

 

/// <summary>
 /// MS에서 받아온 url을 서버(WCF Service)에 보낸다.
 /// </summary>
 private void SubscribeToService()
 {
     string appid = "1";
     
     //string baseUri = "http://localhost:19976/Notifications/Register?uri={0}&appId={1}";
     string baseUri = "http://192.168.10.174:6060/Notifications/Register?uri={0}&appId={1}";        
 
     string theUri = String.Format(baseUri, httpChannel.ChannelUri.ToString(),appid);
 
     WebClient client = new WebClient();
     client.DownloadStringCompleted += (s, e) =>
         {
              if (e.Error == null)
              {
                  Dispatcher.BeginInvoke(() => UpdateStatus("Registration Success"));
              }
              else 
              {
                  Dispatcher.BeginInvoke(() => UpdateStatus(e.Error.Message));
              }
 
         };
     
     client.DownloadStringAsync(new Uri(theUri));
 }

 

이렇게 서버에게 URI를 보내 준다. WCF Rest 서비스니 웹처럼 파라미터를 넣어서 전달

 

이렇게 해서 클라이언트 완성


NotificationToastClient.zip

Posted by 동동(이재동)
Windows Phone 72011. 5. 27. 18:21

Surface 프로젝트를 들어가기 하루 이틀전(망고 업데이트가 되기전에) 이미 조금 만들어 놓았던

 

Notification 프로젝트였다. 근데 다행히(?) surface 시연이 끝나고 바로 망고가 나왔다 ㅋㅋ

 

조금밖에 안해 놨었기때문에 크게 수정안해도 됬었다..(어짜피 다시 제작 ㅋㅋ)

 

자 그럼 망고버전에서는 어떻게 Toast Notification을 사용하는지 알아보자 이전버전은 이제 무시하자 미리 포스팅 안하길 잘했다 ㅋㅋ

 

망고 버전 샘플이 있음으로 참고 및 많은 수정을 해서 더 쉽게 만들어 보았다.

 

일단 시작하기위해  3가지를 만들어야 한다.

 

-첫번째 윈폰 클라이언트 프로그램

이건 당연히 만들어야 하는것이다

HttpNotificationChannel을 이용하여 MS으로부터 ChennelUri를 얻어 온다. 이 얻어온 URI을 가지고

클라이언트에게 메세지를 보낸다 클라이언트 고유의 ID라 생각하자.

자 이것을 Notification Server에 보내야 한다.

 

-두번째 WCF Rest Service(그냥 WCF 를 써도 돼지만 난 범용으로 사용 하기 위해서 Rest 사용)

자 이제 아까 만든 클라이언트로부터 URI를 받을것이다.

이것을 저장해 놓자.. 서비스가 절대 멈추지 않을꺼라 생각하면 그냥 저장해도 돼지만

리셋될것을 대비해 DB에 저장해 놓는것이 안전하다.(영구적 서비스라면?)

 

-세번째 메세지를 보내는 관리자를 위한 클라이언트

서버랑 클라이언트가 준비되어 있다면 보낼 메세지를 입력하는 UI를 만들어서 관리자가 메세지를 쓰는

프로그램을 만들어야 한다. 이것역시 서버에 저장된 URI들을 받아서 메세지들을 전달한다.

 

자 이제 두번째 부터는 소스와 같이 윈폰 클라이언트 부터 만들어 보자

Posted by 동동(이재동)
Surface2011. 5. 27. 11:15

휴 힘들었다. 거의 이틀만에 만들으라고해서 아직 surface 개념이 없던 나에게 철야까지 하면서

 

힘들게 만들었다. 기계가 바로 전날 와서 테스트를 못해봐서.. 에물레이터에 맞추어서 만들었는데

 

태그 인식이 잘안되고 됐다가 안됐다가를 반복해서 행사 바로 전날 다시 전체 수정을 했다..

 

Tagvisualizer를 이용해서 멋있게 만들었지만 약간 보여주기 용으로 급수정을 해서 마음이 안좋았다..

 

기계만 좋았어도 ㅠㅠ

 

간략하게 소개를 하자면

 

처음 기계를 켜면 이런 화면이 나온다.

 

image

 

그다음에 책을 올리면

 

image

 

 

 

 

image

 

image

 

image

 

이런식으로 책을 넘길때마다 화면이 바뀌고 동영상이 뜬다.

 

마지막에 Develope에 내이름이 써있다. ㅋㅋ

 

많은 사람들에게 시연하는것이라 긴장도 되었지만 재미 있었다. ㅋㅋ

 

실제 시연 동영상은 여기서 볼수 있다.

 

http://www.youtube.com/watch?feature=player_detailpage&v=ruZvqF9ynJY

Posted by 동동(이재동)
Surface2011. 5. 27. 11:06

WPF에서 이런식으로 스토리를 보여주고 싶었다.(이건 완성된버전 ㅋㅋ)

 

image

 

이건 그냥 TextBlock으로 되는것이 아니다.

 

그래서 FlowDocument를 사용하였다..

 

일단 xaml에서 이렇게 코딩을 했다.

 

<FlowDocumentScrollViewer Grid.Row="1" Grid.ColumnSpan="2" VerticalScrollBarVisibility="Hidden" >
    <FlowDocument Background="Transparent">                                        
        <Paragraph FontFamily="Bell MT" FontSize="24" x:Name="DescriptionParagraph">
            <Floater Width="500"  HorizontalAlignment="Left">                            
                <BlockUIContainer>
                    <Rectangle Height="250" />
                </BlockUIContainer>
            </Floater>
            One Day, most of the town’s roads are ruined by the heavy rain. On that day, school bus-Schoobi happens to be late because of constructions on the road. Worrying that children may be waiting at the bus stop, Schoobi drives through the traffic with full speed, even though other cars are starring at him in a disapproving manner. Schoobi gets to a costal road, however, the road condition there is also messy. Dilly-dallying and regreting to go back. Schoobi ends up ramming into the guardail. Schoobi is now in the danger of falling down the cliff. Can Robocar Poli and his team save Schoobi?
        </Paragraph>
    
    </FlowDocument>
   
</FlowDocumentScrollViewer>
 
보면 알겠지만 FlowDocument에서 Paragraph를 사용하고 안에 Floater를 이용해서 안에 투명한 사각형을 왼쪽에 정렬하고 바깥쪽에 글을 입력하였다.
 
그럼 이제 안에 내용 Text를 계속 유동적으로 바꿔야 한다.
그럼 어떻게 해야할까? behind에서 수정하면 된다.
 
paragrah의 x:name을 DescriptionParagraph를 정의 했으니 이걸 변경하면 된다. 소스를 보자
 
private void SetDescriptionPlaceholder(string param)
        {
            DescriptionParagraph.Inlines.Remove(DescriptionParagraph.Inlines.Where(c => c is System.Windows.Documents.Run == true).Select(c => c).FirstOrDefault());
            DescriptionParagraph.Inlines.Add(param);
        }
 

이렇게 inline을 삭제하고 다시 추가하는 형식으로 바꾸었다.

 

이렇게 하면 끝~

Posted by 동동(이재동)
Surface2011. 5. 19. 16:06

아 이것때문에 시간 아까운데 2시간이나 까먹었다…

 

실버라이트랑 다르게 이상하게

 

Blend로 VisualState를 만들고

 

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

 

이렇게 state간의 전환을 할려고 했으나 계속 false를 return 했다. ㅡ.ㅡ!!!

 

인터넷 찾아보니…

 

WPF 버그라던데…

 

해결법은

 

VisualStateManager.GoToElementState(this.Content as FrameworkElement, "Title", true);

 

이렇게 element단위에서 해야한다.. 내참 인터넷에 왜 이런거 해결하는 법 하나도 없는거야?

Posted by 동동(이재동)
wcf2011. 5. 17. 15:57

자 Rest Service를 만들어 보자

 

RestService의 최대강점은  멀티 플랫폼할때 좋다는거다..

 

인자도 그냥 URL형식으로 Get,Post 방법으로 보내면 되고 그렇게 되면 언어나 플랫폼에 상관없이

 

쓸수 있는 아주 편한 진정한 RIA 서비스가 된다.

 

첫번째

 

new-project 해서 새로운 프로젝트를 만들고

 

Online Templates로 간다.. 아마 비쥬얼 스튜디오 2010을 깔았다면 그냥 wcf service가 있을것이다.

 

하지만 우리는 WCF REST Service를 만들것이기때문에 online Template으로 가서 프로젝트를 만든다.

 

image

 

만든뒤에

 

Service1.cs가 보일것이다.

 

물론  이걸써도 돼지만 새롭게 만드는것도 나쁘지 않다.

 

나는 윈폰에서 쓸 Notification Server를 만들꺼기때문에 Notifications.cs란 class를 새로 만들었다.

 

[ServiceContract]
   [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
   [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
   public class Notifications
   {
       private static List<Uri> subscribers = new List<Uri>();
       private static object obj = new object();
 
       [WebInvoke(UriTemplate = "register?uri={uri}", ResponseFormat = WebMessageFormat.Json, Method = "GET")]
       public void Register(string uri)
       {
           // TODO: Return the instance of SampleItem with the given id
           Uri channelUri = new Uri(uri, UriKind.Absolute);
           Subscribe(channelUri);
       }

 

그리고 클래스위에 ServiceContract를 정의 하였으며

 

저렇게 메소드를 만들어서 인자를 받게 만들었다..

 

그리고 중요한 Global.aspx.cs에서

 

 

private void RegisterRoutes()
{
    // Edit the base address of Service1 by replacing the "Service1" string below
    RouteTable.Routes.Add(new ServiceRoute("Service1", new WebServiceHostFactory(), typeof(Service1)));
    RouteTable.Routes.Add(new ServiceRoute("Notifications", new WebServiceHostFactory(), typeof(Notifications)));
}

 

 

이렇게 추가하고 컴파일한후

 

http://localhost:19976/notifications

 

컴파일 뒤에 notifications를 붙여서 접속하면 접속이 잘된다.

 

이제 머 메소드를 붙여 넣든 마음대로 요리하면 된다.

 

아참 이 Registor 메소드를 부르는쪽에서는 이렇게 호출한다.

 

/// <summary>
/// MS에서 받아온 url을 서버(WCF Service)에 보낸다.
/// </summary>
private void SubscribeToService()
{
    string baseUri = "http://localhost:19976/Notifications/Register?uri={0}";        
 
    string theUri = String.Format(baseUri, httpChannel.ChannelUri.ToString());
 
    WebClient client = new WebClient();
    client.DownloadStringCompleted += (s, e) =>
        {
             if (e.Error == null)
             {
                 Dispatcher.BeginInvoke(() => UpdateStatus("Registration Success"));
             }
             else 
             {
                 Dispatcher.BeginInvoke(() => UpdateStatus(e.Error.Message));
             }
 
        };
    client.DownloadStringAsync(new Uri(theUri));
}

 

 

쉽다.

Posted by 동동(이재동)
Windows Phone 72011. 5. 3. 10:15

일단 링크로 대신 나중에 포스트

http://chriskoenig.net/2010/08/16/customizing-wp7-push-notification-tiles/

Posted by 동동(이재동)
Windows Phone 72011. 4. 26. 16:22

윈폰용도 폰인지라.. 모바일 광고를 넣을수가 있다.

 

일단 Microsoft Advertising SDK for wp7을 깔자

 

http://msdn.microsoft.com/en-us/library/ff973720(v=msads.10).aspx

 

그리고

 

레퍼런스에 참조하고 이런식으로 그냥 컨트롤을 xaml에 넣고

 

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <ad:AdControl x:Name="AdControl" AdUnitId="29398 " ApplicationId="b1bc2b62-4f51-4f85-a69c-d28119424405"  VerticalAlignment="Bottom" AdModel="Contextual" Width="420" Height="80" Margin="11,0,25,234" />
        </Grid>

 

Behind코드에

 

메인에 꼭 이걸 써넣자

// Constructor
       public MainPage()
       {
           InitializeComponent();
           Microsoft.Advertising.Mobile.UI.AdControl.TestMode = false;
       }

 

저걸 하지 않았을 경우 광고가 나왔다가 바로 사라진다..

Posted by 동동(이재동)
Windows Phone 72011. 4. 25. 15:16

일단 폰 정보를 얻기 위해서

WMAppManifest.xml에 이걸 추가하고

 

<Capability Name="ID_CAP_IDENTITY_USER" />

<Capability Name="ID_CAP_IDENTITY_DEVICE" />
 
private string GetPhoneANID()
{
    object anid = UserExtendedProperties.GetValue("ANID");
    if (anid == null)
    {
        byte[] deviceId = (byte[])DeviceExtendedProperties.GetValue("DeviceUniqueId");
 
        string id = BitConverter.ToString(deviceId).Replace("-", "");
        anid = id;
    }
    else
    {
        anid = anid.ToString();
    }
 
    return anid as string;
}

이렇게 해서 얻어오면 된다.
Posted by 동동(이재동)
Windows Phone 72011. 4. 22. 13:50

WMAppManifest.xml 에

 

<Capability Name="ID_CAP_IDENTITY_DEVICE"/>

 

를 추가하고

 

string model = null;
object theModel = null;
 
if (Microsoft.Phone.Info.DeviceExtendedProperties.TryGetValue("DeviceName", out theModel))
    model = theModel as string;
MessageBox.Show(model);

 

를 코딩하면 된다.

 

출처 : http://www.nickharris.net/2011/01/finding-the-device-model-on-windows-phone-7/

Posted by 동동(이재동)
Windows Phone 72011. 3. 31. 17:54

이란 에러 메세지를 자주 본다.

 

만약 behind코드(xaml.cs)라면

 

Dispatcher.BeginInvoke(() =>
                                    {
                                        NavigationService.Navigate(new Uri("/Views/RecordView.xaml", UriKind.RelativeOrAbsolute));
                                    });

 

이렇게 쓰면 되겠지만

 

ViewModel 이나 Service에서는 어떻할까?

 

Deployment.Current.Dispatcher.BeginInvoke( ()=>
                       {
                           ServiceLocator.Current.LocationPermissionViewModel.NoButtonClick(null);
                       });

 

이렇게 쓰면 된다.

 

참조 : http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/43177228-1ab2-4489-afea-89b0bf61bdd7

Posted by 동동(이재동)
Windows Phone 72011. 3. 31. 15:13
xaml 상단에 이렇게 datacontext를 연결하고
 
DataContext="{Binding BookViewModel, Source={StaticResource Locator}}"
 
<phone:PhoneApplicationPage
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:controls="clr-namespace:HugeFlow.FortuneCoins.Controls"
    xmlns:uc="clr-namespace:HugeFlow.FortuneCoins.Controls"
    xmlns:wp="clr-namespace:HugeFlow.Phone.Controls;assembly=HugeFlow.Phone.Controls"
    xmlns:Custom="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:HugeFlow_CommandPattern_Interactivity="clr-namespace:HugeFlow.CommandPattern.Interactivity;assembly=HugeFlow.MVVM" 
    x:Class="HugeFlow.FortuneCoins.Views.BookView"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"    
    shell:SystemTray.IsVisible="False" DataContext="{Binding BookViewModel, Source={StaticResource Locator}}">
 
behind에서 datacontext를 연결한후
 
private LocationPermissionViewModel _viewModel;
 
     public LocationPermissionView()
     {
         InitializeComponent();
         _viewModel = this.DataContext as LocationPermissionViewModel;
     }
 
그리고 커맨드를 사용할 버튼 이벤트에 이렇게

private void NoButton_Click(object sender, RoutedEventArgs e)
      {
          _viewModel.NoButtonClickCommand.Execute(null);
      }
Posted by 동동(이재동)
Windows Phone 72011. 3. 25. 17:23

 

다운 받을수 있는 url

http://www.innovativetechguy.com/?p=13

 

 

image

 

이렇게 생겼는데 2가지 모드를 지원한다. 마켓 플레이스 모드로 찍으면 마켓플레이스에 올릴 480 680

 

으로 짤라서 찍고 other로 하면 에뮬레이터 자체를 찍는다.

 

유용한듯?

Posted by 동동(이재동)
Windows Phone 72011. 3. 24. 16:07
 about페이지에 버전을 적어야 할때 프로젝트에서 버전정보를 입력하고
 
Properties의 AssemblyInfo.cs에서 AssemblyVersion을 입력하 곤하는데
 
이걸 빼오는 법이다.
 
Assembly assem = System.Reflection.Assembly.GetExecutingAssembly();
           AssemblyName assemblyName = new AssemblyName(assem.FullName);
 
           Version = assemblyName.Version.ToString(3);
 
 

간단하다..

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

이건 정말 옛날부터 알았던건데 혹시나 까먹을까 해서 쓴다.

 

NavigationServce.Navigate를 이용해서 페이지를 이동할때

 

var uri = new Uri(string.Format("/HugeFlow.Phone.Controls;component/AboutControl/AboutPage.xaml?AppName={0}&Version={1}&SiteAddress={2}&EmailAddress={3}&Year={4}&Company={5}"
                , appName, version, siteAddress, emailAddress, year, companyName), UriKind.RelativeOrAbsolute);

 

이런식으로 파라미터를 줄수 있다 웹과 같다.

 

그렇다면 받는쪽에서는 어떡해 할까?

 

받는 페이지에는

 

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
       {
           base.OnNavigatedTo(e);
 
           string appName;
           string version;            
           string siteAddress;
           string emailAddress;
           string year;
           string companyName;
 
           if (NavigationContext.QueryString.TryGetValue("AppName", out appName) == true)
           {
               AboutPageControl.AppName = appName;
           }
 
           if (NavigationContext.QueryString.TryGetValue("Version", out version) == true)
           {
               AboutPageControl.Version = version;
           }
 
           if (NavigationContext.QueryString.TryGetValue("SiteAddress", out siteAddress) == true)
           {
               AboutPageControl.SiteAddress = siteAddress;
           }
 
           if (NavigationContext.QueryString.TryGetValue("EmailAddress", out emailAddress) == true)
           {
               AboutPageControl.EmailAddress = emailAddress;
           }
 
           if (NavigationContext.QueryString.TryGetValue("Year", out year) == true)
           {
               AboutPageControl.Year = year;
           }
 
           if (NavigationContext.QueryString.TryGetValue("CompanyName", out companyName) == true)
           {
               AboutPageControl.CompanyName = companyName;
           }
       }

 

이렇게 하면 된다.

Posted by 동동(이재동)
Windows Phone 72011. 3. 21. 18:36

지금까지 UserControl만 주구장창 만들어보았으면

 

이번에는 Control을 만들어서 dll로 빼서 편리하게 사용해보자.

 

첨에는 프로젝트를 라이브러리 프로젝트로 하나 만든다.

 

그리고 일단 UI가 있는것은 스타일이 필요할테니 Theme 폴더안에 generic.xaml을 만들자

 

그리고 이렇게 입력하자

 

<ResourceDictionary
    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:c="clr-namespace:AboutPageControlLibrary"    
    xmlns:sys="clr-namespace:System.Windows;assembly=System.Windows" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d">
    <Style TargetType="c:AboutPageControl">
        
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="c:AboutPageControl">                    
                    <Grid>
                        <ListBox x:Name="AppListBox"  Margin="30,0,0,0" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        

 

이렇게 해서 AboutPageControl을 만들고 그안에 단순히 ListBox만 하나 넣었다. x:name은 ApplistBox로 정했다.

 

자 이제

 

cs파일을 하나 만드는데 Control을 상속받자

 

public class AboutPageControl : Control

 

그리고 생성자를 만든다.

public AboutPageControl()
       {
           DefaultStyleKey = typeof(AboutPageControl);

 

이렇게 DefaultStylekey로 하여서 아까 generic.xaml에 정의된 스타일을 가져온다.

 

자 이렇게만 하고 프로젝트 하나 만들어서 여기 dll을 참조 한후 사용하면

 

ListBox가 보일것이다.(사실은 아무것도 안보일껏이다 itemSource가 없으니^^)

 

자 그럼 이제 Listbox에 ItemSource를 정의해보자.

 

일단 저기 generic.xaml에 정의한 스타일의 컨트롤을 호출을 해야 한다.

 

public override void OnApplyTemplate()
       {
           base.OnApplyTemplate();
           this._listBoxControl = GetTemplateChild("AppListBox") as ListBox;
       }

 

이렇게 OnApplyTemplate를 오버라이드 한후

 

GetTemplateChild를 이용해서 Listbox를 _ListBoxControl에 정의하였다. _listBoxControl은 전역변수에 이미 정의를 했다이로써 언제든지 ListBox를 쓸수 있게 되었다.

 

그후에 이제 이 Listbox Itemsource에 data를 넣어보자.

 

public AboutPageControl()
       {
           DefaultStyleKey = typeof(AboutPageControl);
           this.Loaded += new RoutedEventHandler(AboutPageControl_Loaded);
       }

 

loaded에 넣은 이유는 알것이다.

 

 

void AboutPageControl_Loaded(object sender, RoutedEventArgs e)
        {
            List<AppData> appDatas = new List<AppData>();
            appDatas.Add(new AppData() { Id = "App1", Name = "himan2", Description = "haha" });
            appDatas.Add(new AppData() { Id = "App1", Name = "himan2", Description = "haha" });
 
            _listBoxControl.ItemsSource = appDatas;
            _listBoxControl.ItemTemplate = ItemTemplate;

 

이렇게 itemsource를 넣었다.

 

그러면 이제 itemSource도 보일것이다. 근데 또 궁금증이 있다. itemTemplate은 어떻게 줄것인가?

Control이 아니라면 그냥 xaml상에서도 줄수 있지만 여기서 이렇게 behind로 해야만 했다.

저위에 정의 되어 있는 ItemTemplate은 이렇게 정의 해줘야 한다. 미리

 

public DataTemplate ItemTemplate
      {
          get { return (DataTemplate)GetValue(ItemTemplateProperty); }
          set { SetValue(ItemTemplateProperty, value); }
      }
 
      public static readonly DependencyProperty ItemTemplateProperty =
          DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(AboutPageControl), new PropertyMetadata(OnItemTemplateChanged));
 
      protected static void OnItemTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
      {
      }

 

사실 OnItemTemplateChanged는 의미가 없는듯 ;;

 

이렇게 정의 해두고 generic.xaml 에

 

<Setter Property="ItemTemplate" >            
           <Setter.Value>                
               <DataTemplate>
                   <Grid x:Name="grid">
                       <Grid.Resources>
                           <c:FileNameToFilePathImageConverter x:Name="FTFConverter" />
                       </Grid.Resources>
                       <Grid.ColumnDefinitions>
                           <ColumnDefinition Width="100" />
                           <ColumnDefinition />
                       </Grid.ColumnDefinitions>
                       <Grid.RowDefinitions >
                           <RowDefinition />
                           <RowDefinition />
                       </Grid.RowDefinitions>
                       <Image x:Name="image" Source="{Binding iconFileName, Converter={StaticResource FTFConverter}}"  Grid.RowSpan="2" Width="99" Height="99"/>
                       <TextBlock x:Name="textBlock" Text="{Binding Name}" Grid.Column="1" FontWeight="Bold" Margin="20,0,0,0"/>
                       <TextBlock Text="{Binding Description}" Grid.Column="1" Grid.Row="1" FontSize="16" Margin="20,0,0,0" TextWrapping="Wrap" />
                   </Grid>
               </DataTemplate>
       </Setter.Value>
       </Setter>

 

이렇게 Property에 이름을 ItemTemplate로 정의 한다면

 

ListBox에 ItemTemplate이 정의가 되어서 아주 멋있는 ListBox가 보여질것이다. 이미지와 글이 있는^^

 

이제 어떻게 컨트롤을 처음에 만들고 Listbox를 추가하며 그안에 itemSouce와 ItemTemplate을 정의 하는지 알려주었다

Posted by 동동(이재동)
Windows Phone 72011. 3. 21. 18:17

대부분 컨버터 쓸때

 

<phone:PhoneApplicationPage.Resources>
        <Converter:FileNameToFilePathImageConverter x:Key="FTFConverter" />        

 

이런식으로 phoneApplicationPage.Resources안에 넣는다.

 

그러면 Control을 만들려고 할때 쓰는 generic.xaml에서 쓸려면 어디에 넣어야 할까?

 

<Setter Property="ItemTemplate" >            
           <Setter.Value>                
               <DataTemplate>
                   <Grid x:Name="grid">
                       <Grid.Resources>
                           <c:FileNameToFilePathImageConverter x:Name="FTFConverter" />
                       </Grid.Resources>

 

그렇다 이런식으로 Grid.Resources같이  패널 안에 리소스를 만들어 쓰면 된다.

Posted by 동동(이재동)
Windows Phone 72011. 3. 21. 13:15

Webclient에서 인터넷에 xml을 다운 받아서 파싱을 하는데 프로그램을 다시 실행시키지 않는한

 

변경된 xml을 다시 읽어 왔을 때 내용이 변경이 되지 않았다..

 

무슨 이야기인가 하면 xml을 온라인에서 읽다가 xml내용이 변경되어서 다시 읽어왔는데

 

다시 읽어온 xml이 변경하기전 data를 넘겨준다는 이야기 이다.

 

아마 내생각에는 Caching  문제로 한번 읽어온 데이터는 간직하지 않나 싶은데?

 

 

 

Random random = new Random();
 
string XmlURL = "http://URL?UnUsed="+random.Next().ToString();

 

그래서 이렇게 URL뒤에 랜덤 파라미터를 붙여서 캐싱을 막아놓았다..

 

이건 머 예전 웹할때 웹 브라우저 캐싱 피할때 쓰는거랑 똑같다…

 

참고 : http://forums.silverlight.net/forums/p/14453/110001.aspx

Posted by 동동(이재동)
미용2011. 3. 18. 11:13

안녕하세요 휴즈플로우 이재동입니다.

요즘 회사내에 샐러드를 드시는분들이 기하 급수적으로 늘으셔셔 이번 포스트는 다이어트에 대해서 포스팅해보았습니다.

회사생활 특히 프로그래머분들은 한자리에 오래 앉아있는분들이 많기때문에 유용한 정보가 되지 않을까 싶습니다.

그리고 잘못된 다이어트 상식들을 제가 바로 잡아 드리겠습니다.

 

* 계단을 많이 오르내리면 다리가 가늘어진다 - yes

계단 오르내리기는 아주 좋은 유산소 운동 중 하나. 다리에 적당히 근육도 생기고 지방도 잘 연소된다고 합니다.

단, 체중이 너무 많이 나가거나 무릎이 좋지 않은 사람은 관절에 무리를 줄 수 있으므로 다른 운동으로 다이어트를 하는 것이 좋습니다.

계단 오르내리기로 다리 살을 빼고 싶다면 난간을 잡지 말고 무릎을 직각으로 세우며 오릅니다.

두 칸씩 오르내리기를 하면 엉덩이 가 ‘업’되는 효과도 얻을 수 있습니다.

근화씨를 비롯한 몇몇분들이 이미 실행을 하고 계십니다.(절대 블러그 안써서가 아님)

 

* 줄넘기를 하면 종아리가 더 굵어진다 - yes
줄넘기는 유산소 운동의 효과를 볼 수 있지만 몸 전체의 근육을 효과적으 로 사용하기는 어려운 운동입니다.

줄넘기를 할 때는 몸 전체의 하중이 종아리에 집중되기 때문에 약간 굵어질 수 있습니다.

예전에 옥상에서 줄넘기 사서 하루에 50~100개씩이나 하던 시절이 있었는데 지금은 가능한지 모르겠군요

1138671491

 

* 운동하다 말면 살이 찐다 - yes
운동을 하다 중단하면 운동으로 생긴 근육이 소실되면서 지방으로 변합니다.(이부분을 찾아보니

지방이 되는것이 아니라 운동량이 줄어 칼로리 소모량이 그만큼 감소해서 체지방이 더 잘쌓이게 되는것이라네요)

그러므로 운동을 멈춰 에너지 소비량이 줄어든 만큼 식사량을 줄여야 살이 찌지 않는다고 합니다.

그러나 먹는 양을 줄이는 것은 쉬운 일이 아니므로 운동을 시작했다면 조금씩이라도 꾸준히 하는 것이 좋습니다.

지방을 연소하는데 필요한 운동시간도 개개인마다 다르므로 자신의 운동 습관을 체크하고 꾸준하게 운동하는 것이 좋습니다.

일반적으로는 20~25분은 해야 그 이후부터 지방이 연소된다고 합니다.

저같은 경우는 한번 헬스장가면 최소 45분은 하는데요 적어도 저같이는 해야한다고 생각합니다.

하지만 다이어트 를 위한 운동이라면 적어도 1시간~1시간 30분은 해야 효과를 볼 수 있다고 하네요

그리고 운동을 처음 하는 사람은 다른 사람들보다 더 오랜 시간 운동해야 지방이 줄어든다고 합니다. ㅠㅠ

성형수술,다이어트_그후

* 걸을 때 팔을 크게 흔들면 팔뚝 살이 빠진다 - yes
소위 말하는 파워워킹. 팔꿈치를 약간 구부리고 허리를 곧게 펴고 보폭을 크게 해서, 자신의 평소 걸음걸이의 2배 정도 빠르기로 걷는 것은 체내 탄수화 물과 지방을 동시에 소비할 수 있는 운동입니다.

팔에 있는 지방뿐 아니라 온몸의 지방 감소를 기대할 수 있다. 30분 정도 지속해야 효과를 볼 수 있습니다.

 

* 운동할 때 땀을 흘리지 않으면 살이 빠지지 않는다 - no
땀과 관계없이 에너지를 쓰면 살은 빠집니다.

운동을 해도 땀이 나지 않는다는 사람들이 있는데 그것은 운동을 너무 하지 않아 땀구멍이 막혔기 때문.

운동을 꾸준히 계속하면 땀의 양이 늘어납니다.

궂이 땀복이나 마스크 같은거 하고 운동하시는분들(거의 아줌마들?) 잘못된 방법이라고 보시면 됩니다.

 

* 담배를 끊으면 살이 찐다 - no
담배의 니코틴 성분은 지방 분해를 활발하게 해줍니다.

따라서 담배를 끊으면 잠시 동안은 살이 찔 수도 있습니다..

그러나 니코틴 성분에 의한 지방 분해 효과는 매우 미미하고, 오히려 장기간의 흡연이 부신 피질 호르몬의 분비를 촉진해 복부 지방의 원인이 된다는 사실!

금연으로 인해 살이 찐다는 것은 처음 한두 달에만 해당되는 얘기일 뿐입니다.

다만 입이 심심할 때마다 담배 대신 과자 등을 먹어 살이 찌는 경우가 많습니다.

제 주의분중에  밥보다 과자를 더 좋아하는 분이 있더라구요 ㅋㅋ

담배1

 

* 과일은 많이 먹어도 살찌지 않는다?  - no

과일의 약 10%가 당질로 중성지방 상승시키고 복부비만을 유발 할 수 있습니다.

 

*나잇살이란 게 정말 있다?  -yes

20대 이후 성장 호르몬,성호르몬 등의 감소로 근육과 기초대사량이 줄어들게 되어 살이 잘 찌게됩니다

제가 여기에 해당하는 거 같습니다.^^

107

 

*단식하면 살 안찌는 체질로 변한다. –no

단식으로 체중이 주는 것은 것은 수분과 근육의 감소 때문이므로,  단식 끝나면 요요현상으로 살이 더 찌게 됩니다.

 

*특정부위만 빠지는 운동방법도 효과가 있다? –no

일반적으로 다리 엉덩이 아랫배 윗배 가슴 얼굴 순서로 살이 붙고 운동과 다이어트로 체중 감량할 때에는 역순으로

얼굴부터 다리 순서로 살이 빠지게 됩니다.

특정부위만 집중적으로 운동한다고 해서 그 부분만 살이 빠지지는 않습니다.

다만 해당부위 근육을 발달시켜 체형교정에 도움이 될 수는 있습니다.


* 운동한 후에 물을 마시면 살이 찐다? –no

물만 마셔두 살이 찐다는 사람들이 있습니다. 그러나 물에는 칼로리가 없기 때문에

살이 찔 수가 없습니다. 오히려 물을 마시면 신진대사가 활발해져 몸에 필요한 물질을

체내에 받아들이고 노폐물을 체외로 내보내는 체내 활동을 활발히 해줍니다.

또한 열심히 땀 흘리고 운동한 뒤에 체중 감량을 위해 1시간 지나서 수분 섭취를 하는

사람들이 있는데, 갈증이 나는데도 참는 것은 몸에 좋지 않습니다.

운동시함에 나가기 전 계체량 측정이 필요한 경우가 아니라면,

운동 중간 중간에 적절히 수분섭취를 해주시는 것이 원활한 신진대사를 도와

다이어트를 함에 있어서도 도움이 되지 결코 살을 찌우지는 않습니다.

물마시기

 

* 술만 먹고 안주를 먹지 않으면 살이 안찐다? –no

사회생활을 하다보면 간혹 술자리가 생기게 마련입니다.

알콜 자체는 저장되는 칼로리는 아니지만 알콜은 다른 영양소들에 비해

제일 먼저 대사되려는 속성이 있어서 음주 전호 섭취한 음식들의 대사를 방해하여

고스란히 지방으로 저장되게 만들죠.

그렇다고 해서, 술을 먹으면서 기름진 안주는 안먹고 마른 안주만 먹는 사람이 잇있는데,

사실 마른 안주들의 칼로리도 만만치 않게 높습니다. 또한 조금이라도 살이 덜 찌기 위해

안주 없이 술만 마시는 여성이 있는데, 대부분의 술은 곡식이나 과일로 만들기 때문에

그 열량을 그대로 간직하고 있어서 무시할 수 없는 칼로리를 지니고 있습니다.

따라서 정말 살을 빼고 싶다면, 가급적 술자리는 피하는 것이 좋습니다.

e0075425_4ab3747824a50

 

* 원푸드 다이어트를 하면 살이 잘 빠진다? –no

 

벌꿀, 사과, 감자, 고구마, 커피 등등... 한가지 음식으로만 먹는 원푸드다이어트는

가장 현혹되기 쉬운 다이어트지만 가장 치명적이라 할만큼 위험한 다이어트입니다.

물론 당장은 한가지 음식만 먹기 때문에 살이 빠집니다. 하지만 평생 한가지 음식만

먹을수는 없으므로, 다시 원래 식생활로 돌아오는 즉시 지금보다 몸무게가 더 늘어나게 됩니다.

저는 샐러드로 시도중인데 다시 늘어나게 될지도 ㅠㅠ 아 어짜피 빠지지도 않았구나!!

 

자~ 잘못된 상식들을 바로 잡으셧나요?

 

앞으로도 서로 좋은 건강 정보들을 공유해서 건강하고 활기찬 휴즈플로우 식구들이 되기를 기원합니다^^

Posted by 동동(이재동)
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 동동(이재동)
좋은 프로그램2011. 3. 8. 09:42

인덱싱 해서 하는것인줄 알았는데 아닌거 같다.


바로 찾아진다. ㄷㄷㄷ


Everything search engine

http://www.voidtools.com/

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    "                  &quot;
amp    &                  &amp;
apos    '                &apos;
lt    <                     &lt;
gt    >                   &gt;

 

이렇게 쓰인다

 

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

 

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

 

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

 

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

Posted by 동동(이재동)
VisualStudio2011. 2. 16. 11:00

물론 기본으로도 잘되어있고 더 좋은 Extensions이 많이 있지만  일단 써본다.

 

CodeMaid

내가 굉장히 좋아하는 extension이다.

원클릭으로 코드를 다 깔끔하게 해준다.(Clean UP)

그리고 지금 내가 보고 있는 코드가 솔루션 익스에서 어디에 있는지도 한번에 찾아준다.

난 코드를 다 짠후 이걸 실행해서 한번 점검한다. ㅋㅋ

 

 

Productivity PowerTools

이것두 유용한게 많지만 난 주로

Pin Tab을 하기 위해서 쓴다.

코딩을 하다보면 내가 사용하는 몇개의 파일만 이동하는데 pib tab으로 설정해두면

파일을 찾느라 왔다갔다 하지 않아도 된다. 아주 편리하다.

그외에 ctrl 키를 이용하여 메소드를 마우스 클릭하면 이동하는것도 있는데

f12가 익숙해서 잘쓰지는 않는다.

 

Utra Find

내가 정말 자주 쓰는 기능이다.

어떤 메소드의 정의를 찾을때 Shift+F12로 찾는걸로는 한계가 있는데

이건 물리적으로 파일을 검색하여 단어가 들어간 모든 것을 찾아준다.

그리고 옵션도 좀더 다양하고 기존 찾기 기능보다 훨신 강력하다


Quick Open File For Visual Studio 2010

큰프로젝트를 하다보면 파일이 너무 많아서 이동하기 쉽지 않은데 단축키도 지원하고

검색만으로 프로젝트를 검색해서 열어준다.


VS10x Code Map v2

코드를 한눈에 볼수 있다. 디폴트로 왼쪽에 나타나며 이쁘게 짤려고 노력중인 나에게 좋은 것 같다.


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 동동(이재동)