ü  Silverlight 배포하는 방법

1.     Object 태그를 이용한 방법

-       Naver에서 보면 퍼가기와 같은 기능 구현이 가능하며, 특정 웹 서버의 제약 없이 구동 할 수 있어 Silverlight 배포 추천 방법이라 할 수 있습니다.

2.     Silverlight.js의 함수를 이용한 방법

3.     ASP.NET Silverlight 컨트롤을 이용한 방법

-       3번과 배포 방법은 웹사이트가 닷넷 환경이어야 한다는 제약이 있습니다.

ü  Object 태그를 이용한 방법 (알아두면 좋은 것)

1.     Object 태그의 필수적인 속성

속성

내용

Id

HTML 안에 포함될 실버라이트 플러그인의 이름

Data

실버라이트를 어떻게 로드할지에 대한 MIME 타입

Type

실버라이트의 버전

Height

실버라이트를 나타낼 높이(픽셀, %, 둘 다 지정가능)

Width

실버라이트를 나타낼 넓이(픽셀, %, 둘 다 지정가능)

2.     속성과 이벤트의 주요 파라미터

파라미터

내용

Source

URI형식으로 나타낸 실버라이트 파일의 주소이고, 기본 값은 null입니다.

onError

실버라이트에서 에러가 발생할 경우 그 에러 내용을 Javascript로 전달하여 보여줍니다.

onResize

실버라이트의 ActalHeight, ActualWidth 속성이 변경될 때 발생하는 이벤트이며, 처음 로드할 때도 발생하지만 Full-Screen 모드로 변경될 때는 발생하지 않습니다.

3.     선택적인 파라미터

파라미터

내용

background

실버라이트가 로드될 때의 배경색으로 기본값은 null입니다.

enableHtmlAccess

HTML DOM에서 실버라이트 개체로의 접근이나 실버라이트에서 HTML 컨텐트로의 접근을 허용할지에 대한 여부로 기본값은 false입니다.

initParams

실버라이트 런타임으로 전달할 초기 설정 문자열로 콤마(,)을 이용해서 여러 개의 문자열을 구분하여 전달 할 수 있습니다.(key1=value1,key2=value2,key3=value3)

maxFrmaerate

1초간 보여줄 프레임 수의 최대치로 기본값은 60입니다. 이 값은 높을수록 사용자 브라우저의 성능을 늦출 수 있고, 또한 낮을수록 애니메이션이 상당히 부자연스러울 수 있습니다.

splashScreenSource

Source 파라미터에서 지정한 파일이 다운로드 되는 동안의 로딩을 보여줄지에 대한 여부입니다.

windowless

HTML과 혼합되어 사용할 수 있는 Windowless 모드를 설정할 지에 대한 여부로 기본 값은 fasle입니다. 이 속성은 MS 원도우에서 동작되는 브라우저에만 작동됩니다.

*음영 처리된 부분은 기억해 두시는 겟 좋습니다.

4.     추가적인 이벤트 파라미터

파라미터

내용

onLoad

실버라이트가 에러없이 로드되고 모든 내용이 표시될 때 발생하는 이벤트입니다.

onSourceDownloadComplete

Source 파라미터에서 지정한 파일의 다운로드가 완료될 때 발생하는 이벤트입니다.

onSourceDownloadProgressChanged

Source 파라미터에서 지정한 파일의 다운로드가 진행될 떄 발생하는 이벤트입니다.

5.     애니메이션의 진단을 위한 추가 파라미터

-       설정한 속성 외에도 프레임 속도를 브라우저에 보여주거나 렌더링되는 위치를 진단해 보고 싶을 경우 사용합니다. 이 부분에 대해서는 자세히 정리 하지 않겠지만 도움이 될 만한 사이트 주소를 걸어두도록 하겠습니다. (링크)

 

 

ü  Sample Code

1.     initParams을 이용한 데이터 전달하기

-       Silverlight 응용 프로그램 빌드 시, 생성되는 TestPage.html object태그에 파라미터 추가합니다.

Code

TestPage.html

<object data="data:application/x-silverlight," type="application/x-silverlight-2" width="100%" height="100%">

             <param name="source" value="DemoSample4.xap"/>

             <param name="onerror" value="onSilverlightError" />

             <param name="background" value="white" />

             <param name="minRuntimeVersion" value="2.0.31005.0" />

             <param name="autoUpgrade" value="true" />

             <param name="initParams" value="message1=demo1,message2=demo2" />

             <a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">

                           <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Microsoft Silverlight 가져오기" style="border-style: none"/>

             </a>

</object>

-       App.xaml.cs에서 Application_Startup 이벤트에서 해당 값을 가져와서 Page.xaml에서 값 전달 받아, 메시지창 띄우기

Code

App.xaml.cs

private void Application_Startup(object sender, StartupEventArgs e)

{

    string strMessage = e.InitParams["message1"] + e.InitParams["message2"];

    this.RootVisual = new Page(strMessage);

}

Page.xaml.cs

public Page(string strMessage)

{

    InitializeComponent();

 

    MessageBox.Show(strMessage);

}

2.     Silverlight에서 HTML 개체에 접근하기

-       Silverlight 역시 DOM 방식을 이용하여 HTML 엘리먼트에 접근할 수 있습니다.

-       TestPage.html Silverlight div 영역 상단에 우선 HTML 개체인 input 엘리먼트를 추가합니다.

Code

TestPage.html

<input type="text" id="txtDemo" value="demo" />

<div id="silverlightControlHost">

             <object data="data:application/x-silverlight," type="application/x-silverlight-2" width="100%" height="100%">

                           <param name="source" value="DemoSample4.xap"/>

                           <param name="onerror" value="onSilverlightError" />

                           <param name="background" value="white" />

                           <param name="minRuntimeVersion" value="2.0.31005.0" />

                           <param name="autoUpgrade" value="true" />

                           <a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">

                                        <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Microsoft Silverlight 가져오기" style="border-style: none"/>

                           </a>

             </object>

             <iframe style='visibility:hidden;height:0;width:0;border:0px'></iframe>

</div>

-       Page.xaml에서 텍스트 박스와 버튼 컨트롤 추가하고, 버튼 클릭 이벤트에 텍스트 박스의 값을 HTML개체인 input value에 넣은 로직을 구현해보겠습니다.

Code

Page.xaml

<UserControl x:Class="DemoSample4.Page"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Width="400" Height="300">

    <StackPanel x:Name="LayoutRoot" Background="White" Orientation="Horizontal">

        <TextBox x:Name="TextBox1"  Width="150" Height="20"></TextBox>

        <Button x:Name="Button1" Width="100" Height="20" Content="클릭" Click="Button1_Click"></Button>

    </StackPanel>

</UserControl>

Page.xaml.cs

//추가 네임스페이스

using System.Windows.Browser;

 

private void Button1_Click(object sender, RoutedEventArgs e)

{

    //현재 HTML 페이지의 Document 가져오기

    HtmlDocument document = HtmlPage.Document;

 

    //GetElementById input 개체 접근

    HtmlElement element = document.GetElementById("txtDemo");

 

    //GetAttribute value 값 가져오기

    //element.GetAttribute("value");

 

    //SetAttribute value 값 설정하기

    element.SetAttribute("value", TextBox1.Text);

}

Result

  =>

ð  상단 영역은 HTML 개체이고, 아래는 Silverlight 영역입니다.

ð  Silverlight 영역의 텍스트박스에 텍스트 입력 후, 클릭 하시면, HTML 개체의 값이 변경되는 것을 볼 수 있습니다.

3.     HTML 엘리먼트의 이벤트 구독하기

-       테스트 페이지에 2번과 같이 Silverlight 영역 상단에 텍스트박스와 버튼 개체를 추가합니다.

Code

TestPage.html

<input type="text" id="txtDemo" value="demo" />

<input type="button" id="btnDemo" value="메시지 보이기" />

-       Page.xaml.cs에서 Page() 생성자에 HTML 개체 이벤트를 로직을 추가합니다.

Code

Page.xaml.cs

public Page()

{

    InitializeComponent();

 

    //이벤트 구독

    HtmlElement btnElement = HtmlPage.Document.GetElementById("btnDemo");

    btnElement.AttachEvent("onclick", new EventHandler<HtmlEventArgs>(this.OnBtnDemoClicked));

}

 

private void OnBtnDemoClicked(object sender, EventArgs e)

{

    HtmlElement txtElement = HtmlPage.Document.GetElementById("txtDemo");

    MessageBox.Show(txtElement.GetAttribute("value"));

}

Result

4.     Silverlight Javascript의 연동

-       Silverlight에서 Scriptable 어트리뷰트를 제공해 주며, 어트리뷰트를 선언함으로써 자바스크립트로의 접근을 허용할 수 있습니다.

-       Silverlight 응용 프로젝트 생성 후, TestPage.html 파일에 input 엘리먼트를 추가하고, Silverlight Object 태그에 id가 지정되어 있지 않는다면, id를 지정합니다.

Code

<body>

    메시지 입력 : <input type="text" id="txtMessage" /><br />

    <input type="button" id="btnReg" onclick="RegMessage()" value="등록" />

 

    <div id="silverlightControlHost">

                           <object id="silverlightObject" data="data:application/x-silverlight-2,"  type="application/x-silverlight-2" width="100%" height="100%">

                                        <param name="source" value="ClientBin/DemoSample4.xap"/>

                                        <param name="onerror" value="onSilverlightError" />

                                        <param name="background" value="white" />

                                        <param name="minRuntimeVersion" value="2.0.31005.0" />

                                        <param name="autoUpgrade" value="true" />

                                        <a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">

                                       <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Microsoft Silverlight 가져오기" style="border-style: none"/>

                                        </a>

                           </object>

                           <iframe style='visibility:hidden;height:0;width:0;border:0px'></iframe>

    </div>

</body>

-       Page.xaml에서 받은 텍스트를 보여줄 TextBlock를 선언하고, Page.xaml.cs에서 HTML의 자바스크립트에서 접근할 수 있는 속성과 메서드를 만들겠습니다.

Code

Page.xaml

<UserControl x:Class="DemoSample4.Page"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Width="400" Height="300">

    <Grid x:Name="LayoutRoot" Background="White">

        <TextBlock x:Name="txtMessage" Text="메시지 : " ></TextBlock>

    </Grid>

</UserControl>

 

Page.xaml.cs

[ScriptableType]

public partial class Page : UserControl

{

    public string message;

 

    public Page()

    {

        InitializeComponent();

        HtmlPage.RegisterScriptableObject("MessageInfo", this);

    }

 

    [ScriptableMember()]

    public void AlertMessage()

    {

        txtMessage.Text = "메시지 : " + this.Message;

 

        //자바스크립트 함수 호출하기

        //MessageBox.Show("등록되었습니다."); 와 동일함.

        HtmlElement alertScript = HtmlPage.Document.CreateElement("script");

        alertScript.SetAttribute("text", "alert('등록되었습니다.');");

        HtmlPage.Document.DocumentElement.AppendChild(alertScript);

    }

  

    [ScriptableMember()]

    public string Message

    {

        get { return message; }

        set { message = value; }

    }

}

Description

ð  클래스 속성에 [ScriptableType]를 선언하면, HtmlPage.RegisterScriptableOjbect() 메소드를 통해 모든 공용 속성, 메서드 및 이벤트를 JavaScript 코드에서 사용할 수 있으며, Javascript에서의 접근을 위해 반드시 선언하여야 합니다.

ð  각각의 속성에 선언한 [ScriptableMember()] 어트리뷰트는 HTML스크립트에서 해당 코드에 접근할 수 있도록 허용하기 위해 선언해 주어야 합니다.

-       TestPage.html 에서 RegMessage() 스크립트를 작성합니다.

Code

<script type="text/javascript">

    function RegMessage() {

 

        //실버라이트 객체

        var host = document.getElementById("silverlightObject");

 

        //사용자 정보 등록

        host.content.MessageInfo.Message = document.getElementById("txtMessage").value;

 

        //사용자 메서드 호출

        host.content.MessageInfo.AlertMessage();

    }

</script>

ð  HtmlPage.RegisterScriptableOjbect()에서 선언하였던 Script Key를 통해 JavaScript 코드에서 접근이 가능합니다.

Result

=>

+ Recent posts