2009. 7. 14. 20:03

Out Of Browser로 사용해오던 실버라이트 윈도우 어플리케이션이 버전이 업데이트 될 수도 있다. 이럴 경우 실버라이트 어플리케이션도 당연히 업데이트 되어야 할 것이다.
이를 위해 API로 업데이트를 위한 코드도 함께 제공된다.(당연한거 아냐..)

    Application.Current.CheckAndDownloadUpdateCompleted += (s, e) =>
    {
        if (e.UpdateAvailable)
        {
                MessageBox.Show(@"어플리케이션 업데이트를 위해 재시작");
        }
    };
    Application.Current.CheckAndDownloadUpdateAsync();


그 외에 Out Of Browser관련 API가 여러가지가 있겠지만.. 눈에 띄는건 아래 함수정도였다.
bool Application.Current.IsRunningOutOfBrowser {get;} 
  : OutOfBrowser로 실행되는지 여부

Out of Browser 설치창 띄우기
private void btnInstall_Click(object sender, RoutedEventArgs e)
{
     if (Application.Current.InstallState == InstallState.NotInstalled)
     {
          Application.Current.InstallStateChanged += new EventHandler(Current_InstallStateChanged);
          Application.Current.Install();
     }           
}

void Current_InstallStateChanged(object sender, EventArgs e)
{
    MessageBox.Show("설치 완료");
}

네트워크 상태변경 이벤트
using System.Net.NetworkInformation;

...
NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged);
...

void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)
{       
  if (NetworkInterface.GetIsNetworkAvailable())
  {  
    // 연결됨
  }
  else
  {
    // 연결안됨
  }
}


블로깅 열심히 했더만.. 실버라이트 공식 사이트에 동영상이 있네요 ㅜㅜhttp://silverlight.net/learn/learnvideo.aspx?video=187318


결론으로
1. OutOfBrowser 기술을 이용하여 online, offline 작업이 가능하다고 하니 잘 응용하면 정말 윈도우 어플리케이션 같은 프로그램이 만들어질 수도 있을 것 같다. (격리파일과 함께..)
2. 못내 아쉬운점은 XAP파일이 업데이트가 되면 실버라이트 윈도우 어플리케이션에서는 실행 직전에 버전을 확인하여 자동업데이트 되었으면 좋았을텐데.. 그렇지 않고.. API를 통하여 업데이트를 하고 재시작을 해야하는 불편함이 있다.
3. 실버라이트 윈도우 어플리케이션이 업데이트되면 업데이트 메시지를 보여주고 직접 종료하고 싶었지만 종료 함수가 있는건지 없는가 보다.... (찾지 못했다.)
Posted by CoolDragon
2009. 7. 14. 20:00

실버라이트로 3로는 처음으로 블로깅을 한다.
실버라이트3에서 처음 등장한 out of browser 라는 기술은 기존에 웹 브라우저에서만 동작하던 RIA를 브라우저 밖에 윈도우 어플리케이션처럼 사용할 수 있게 한다.

개발환경은 VS 2008 SP1에 실버라이트 3 Tools가 설치되어있어야 가능하다. (당연한건가..)

실버라이트 프로젝트를 생성하고 프로젝트 속성창을 띄운다.
실버라이트 탭에서 Enable running application out of browser를 체크한다.


그리고 바로 우측에 있는 Out-of-Browser Settings... 버튼을 클릭하면 아래와 같은 창이 나타난다. 이창은 실버라이트 윈도우 어플리케이션(?)으로 되었을 때의 기본 속성을 설정한다.


아래 화면은 아이콘 등록시 나타나는 화면이다.(아이콘을 미리 등록해야 선택할 수 있다.)


설정이 완료되면 프로젝트의 Properties폴더에 OutOfBrowserSettings.xml 파일이 생성된다.
(이 파일은 예상한 것과 같이 위에서 작업한 설정값들이 XML 형태로 저장된다.)

그럼 빌드를 해본다. (배경색만 회색으로 바꿨다.)
브라우저의 실버라이트 화면에서 마우스 오른쪽 버튼을 클릭하면 컨텍스트 메뉴가 나타난다.

위의 컨텍스트 메뉴중 [이 컴퓨터에 OutofBrowser Application 설치...] 를 클릭하면 아래처럼
실버라이트 윈도우 어플리케이션 설치 창이 나타난다.

    - 시작 메뉴 : 윈도우시작메뉴 > 프로그램 > 'OutofBrowser Application' 메뉴로 등록된다.
    - 바탕화면 : 바탕화면에 실행아이콘이 생성된다.

확인 버튼 클릭과 동시에 실버라이트 윈도우 어플리케이션이 실행된다.


ps. 이러다 정말 왠만한 윈도우 어플리케이션 명함도 못내밀게 생겼다.

Posted by CoolDragon
2009. 6. 30. 10:39

ASP.NET 페이지 라이프 사이클
http://msdn.microsoft.com/en-us/library/ms178472.aspx

마스터페이지와 컨텐트 페이지의 이벤트 순서

이벤트 순서

Module + 페이지 라이프 사이클
Posted by CoolDragon
2009. 6. 23. 17:42


전체화면 (Application.Current.Host.Content.IsFullScreen = true;) 에서는 보안의 이유로 키보드 사용을 제한 하고 있다. 참고해 봅시다~

---이 키만 사용 가능---
ESC
space
arrow keys
tab 
home
enter
end
pageup/pagedown
-----------------------

출처 :
http://silverlight.net/blogs/msnow/archive/2008/09/04/silverlight-tip-of-the-day-35-full-screen-mode-implementation.aspx


Posted by CoolDragon
2009. 5. 21. 17:16

1. Visual Studio 2008 실행한다. (VS 2005도 특별히 틀릴것 같진 않다.)
2. 프로젝트를 열거나 생성한다. (C#.NET 프로젝트(클래스라이브러리 또는 응용프로그램 등등)
3. 아래 참조 추가를 한다. (아마 오피스가 설치되어있어야 할것 같다.)


4. 그후엔 아래와 같이 코드를 사용하면 된다.


using Microsoft.Office.Interop.PowerPoint;
using Microsoft.Office.Core;


            OpenFileDialog open = new OpenFileDialog();
            if (open.ShowDialog() == DialogResult.OK)
            {

                ApplicationClass app = new ApplicationClass();
                Presentation ppt = app.Presentations.Open(open.FileName, MsoTriState.msoTrue, MsoTriState.msoFalse, MsoTriState.msoFalse);

                for (int i = 0; i < ppt.Slides.Count; ++i)
                {
                    ppt.Slides[i + 1].Export(@"E:\Test\VS2008\Winform\TestPPT\TestPPT\bin\Debug\" + i + ".png", "PNG", (int)ppt.Slides[i + 1].Master.Width, (int)ppt.Slides[i + 1].Master.Height);
                }
                ppt.Close();
                app.Quit();
            }

Posted by CoolDragon
2009. 3. 19. 15:30


System.Net 네임스페이스를 통해서 단순히 소켓프로그래밍(TCP통신, UDP통신)만 하는것이 아니다.
여러가지 많은 것을 할 수 있는데.. System.Net.NetworkInformation.Ping에 대해 알아보겠다.

보통 cmd창에서 아래와 같이 해본사람이 많을 것이다.
    c:\> ping 127.0.0.1 (엔터)

이런 작업을 C#.NET 코드로 구현이 매우 쉽게 가능했다. 아래 샘플 코드만으로도 쉽게 이해할 수 있으리라 생각한다.

Ping.Send 함수는 overloading이 많은데 자세한 내용은 아래 링크를 참고하면 되겠다.
 -> http://msdn.microsoft.com/ko-kr/library/7hzczzed.aspx

참고로 무조건 timeout이 발생하는 hostname이 있을 수 있다. (예:www.daum.net, www.naver.com 등)
이것은 아마도 네트워크 관리자(?)가 해당 서버로 ping요청이 허용되지 않도록 막았을 가능성이 매우 크다.

-------------------------------------- 샘플코드 --------------------------------------

System.Net.NetworkInformation.Ping p = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingReply reply = p.Send("127.0.0.1"); // www.contoso.com
MessageBox.Show(reply.Status.ToString() + "//" + reply.RoundtripTime.ToString());

--------------------------------------------------------------------------------------

Posted by CoolDragon
2009. 3. 16. 10:59

Silverlight를 ControlTemplate와 DataTemplate 를 접했다.
자주 접한 것 같지만 이 녀석들은 내겐 참 헷갈린다. (곧 잡아 먹어주겠다~ 흐흐흐)
이번 블로깅을 통해 조금이나마 개념 파악을 위해 DataTemplate를 정리해 보고자 한다.

그중 가장 흔하게 접하는 것이 ListBox 컨트롤의 ListBoxItem일 것이다.
이 ListBoxItem을 XAML 코드를 보면서 이해해 보고자 한다.

ListBoxItem을 다른 형태로 출력하는 방법은 아래 2가지가 있다.
(사실 아마 더 있을지도 모른다. 지금 개념파악을 위해 정리하는 것이므로 더 있으면 추가하도록 할 것이다.)

--------------------------------코드보기-----------------------------------

1) Inline 방법

<UserControl ...>

<ListBox x:Name="MyBooks" Margin="5" ItemsSource="{Binding}">
 <ListBox.ItemTemplate>
  <DataTemplate>
   <StackPanel Orientation="Horizontal" >
    <TextBlock Text="{Binding Name}" />
    <TextBlock Text="{Binding Birthday}" />
   </StackPanel>
  </DataTemplate>
 </ListBox.ItemTemplate>
</ListBox>

</UserControl>


--------------------------------------------------------------------------------

2) Resource 방법

<UserControl ...>
<UserControl.Resources>
 <DataTemplate x:Key="DataTemplate1">
  <StackPanel Orientation="Horizontal" >
   <TextBlock Text="{Binding Name}"/>
            <TextBlock Text="{Binding Birthday}" />
  </StackPanel>
 </DataTemplate>
</UserControl.Resources>

...

<ListBox ItemTemplate="{StaticResource DataTemplate1}" x:Name="listboxMediaList" Margin="5,3,5,5" Grid.Row="1"  />

...

</UserControl>

Posted by CoolDragon
2009. 3. 9. 19:23

하나의 팁쯤이라고 생각해도 될 듯 하다.
.NET 에서 자바스크립트에서 사용되는 escape와 같은 함수를 사용하고 싶을때가 혹시라도 있을 것이다.
그럴 경우 난 System.Web.HttpUtility.UrlEncode를 사용하면 되는줄 알았다.
하지만 변환되는 형식이 당연히 틀렸다. (사실 틀릴줄은 알았지만 뭐 그냥 써도 되는줄로 알고 었었을 뿐이다.)
그런데 구글링을 통해서 알아낸 사실은 따로 escape와 같은 역할을 하는 클래스가 존재한다는 것이었다.
그 방법은 아래와 같다.

1. Microsoft.JScript 어셈블리를 참조한다.
2.
  escape    => Microsoft.JScript.GlobalObject.escape("바꿀 문자열");
  unescape => Microsoft.JScript.GlobalObject.unescape("바꿀 문자열");


이외에도 Microsoft.JScript.GlobalObject 클래스의 멤버가 여러가지 있으니 나중에 자바스크립트 관련된 일이 있으면
이 클래스를 우선 참고할 필요가 있겠다.

ps. 참 쉽죠 잉~?

Posted by CoolDragon
2009. 2. 6. 11:29


IE를 띄우려면 2가지 방법이 있다.
Process 클래스를 이용한 방법과 System32폴더에 존재하는 SHDocVw.dll을 참조해서 사용하는 것이다.

첫째 Process 클래스를 이용한 방법을 알아보자.
오나전 쉽다. 아래 코드를 보면 이해가 될 것이다.
여기서 Process 클래스의 WaitForExit(); 함수를 호출하면 Modal형태로 띄울 수 있게된다.
------------------------------------------------------------------------------------------------------------
        private void button1_Click(object sender, EventArgs e)
        {
            ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
            startInfo.Arguments = "http://www.naver.com";

            Process browser = new Process();           
            browser.StartInfo = startInfo;
            browser.Start();
            browser.WaitForExit();           
        }
------------------------------------------------------------------------------------------------------------

둘째 SHDocVw.dll를 참조한 방법을 살펴보자.
 1. System32 폴더에서 SHDocVw.dll를 찾아 참조를 한다.
 2. 그리고 아래 샘플 코드를 보면 이해가 될 것이라 생각한다.
 
  - (예1) 브라우저로 창을 띄움
------------------------------------------------------------------------------------------------------------
            object vPost, vHeaders, vFlags, vTargetFrame, vUrl;
            string cPostData;
            vFlags = null;
            vTargetFrame = null;
            vUrl = "http://localhost/testpage.asp";
            vHeaders = "Content-Type: application/x-www-form-urlencoded" + Convert.ToChar(10) + Convert.ToChar(13);
            cPostData = "test1=1&test2=2&test3=3";
            vPost = ASCIIEncoding.ASCII.GetBytes(cPostData);

            SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();
            ie.Visible = true;
            ie.Navigate2(ref vUrl, ref vFlags, ref vTargetFrame, ref vPost, ref vHeaders);
------------------------------------------------------------------------------------------------------------
  - (예2) 팝업(팝업형태의브라우저)으로 창을 띄움
    a. 빨갛게 되어있는 소스만 틀리므로 그부분을 참고한다.
    b. SHDocVw.IWebBrowserApp 속성은 더 있는데 어떻게 써야할지는 아직 잘 모르겠다~ (모르면 구글링을 해보세요)
------------------------------------------------------------------------------------------------------------
            object vPost, vHeaders, vFlags, vTargetFrame, vUrl;
            string cPostData;
            vFlags = null;
            vTargetFrame = null;
            vUrl = "http://localhost/testpage.asp";
            vHeaders = "Content-Type: application/x-www-form-urlencoded" + Convert.ToChar(10) + Convert.ToChar(13);
            cPostData = "test1=1&test2=2&test3=3";
            vPost = ASCIIEncoding.ASCII.GetBytes(cPostData);

            SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();
            SHDocVw.IWebBrowserApp WebBro = (SHDocVw.IWebBrowserApp)ie;
            WebBro.Height = 500;  // 세로 길이
            WebBro.Width = 500;   // 가로 길이
            WebBro.ToolBar = 0;
            WebBro.Visible = true;
            WebBro.Navigate(vUrl.ToString(), ref vFlags, ref vTargetFrame, ref vPost, ref vHeaders);
------------------------------------------------------------------------------------------------------------

아무튼 위와 같은 코드를 통해 IE를 띄울 수 있으며
Process에서는 MainWindowHandle 가지고 있고 SHDocVw.InternetExplorer 클래스 또한 HWND라는 속성이 있으므로
각 속성들을 통해 프로세스를 주무를 수 있지 않을까 싶다. (안되면 뭐 말고~)

Posted by CoolDragon