[Info]Tags categorized posts and contents patterns..

[AJAX] Ajax Code E xamples.. [Book] About the book.. [CSS] CSS Code E xamples.. [DB] Sql Code E xamples.. [DEV] All development stor...

레이블이 XAML인 게시물을 표시합니다. 모든 게시물 표시
레이블이 XAML인 게시물을 표시합니다. 모든 게시물 표시

2016년 2월 18일 목요일

[DEV]Silverlight 1.0 을 Javascript로 다뤄보기..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

요즘 한꺼번에 이것 저것 보느라고 좀 어렵긴 한데 실버라이트는 주워만 듣다가 처음 배우니까 전체 개념을 잡기가 쉽지 않았다. 이것저것 배우고 있기는 한데 전체 그림을 아직 못그리고 있으니까 헷갈리기도 하고 맞는건지 아닌건지 잘 모르겠고 포스팅을 하려면 좀 정리가 되어야 하는데 정리가 되지 않는 상황이다.

그래서 포스팅을 미루고 있긴 했는데 또 그러니까 배운것도 정리가 안되서 계속 다음수업나올때 마다 헷갈려서 배운거라도 좀 정리해서 내껄로 만들어야 겠다. 2차적으로 정보공유에 목적을 두고 내가 알게 된 지식은 공유한다는 원칙을 가지고 있지만 1차적인 블로그의 목적은 내가 배운걸 더 잘 기억하고 나중에 쉽게 찾아볼 수 있게 해서 삽질을 줄인다는데 그 목적이 있으니.... (잘못된 정보 전달을 하게 될까봐 좀 신경쓰이긴 하지만 그런 부분은 다른 고수분들이 지적해 주실꺼라고 생각하고.. ㅎㅎ)


잡설이 길었으니 이제 자바스크립트로 핸들링을 해보자. 앞의 포스팅에서 얘기했듯이 1.0에서는 실버라이트를 자바스크립트로 핸들링한다. 이전 포스팅에 있던  XAML을 가져와보자.

Xml

<Canvas xmlns="http://schemas.microsoft.com/client/2007"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Loaded="silverlightOnLoad" >
    <Ellipse Height="100" Width="100" Stroke="Black" StrokeThickness="10" Fill="SlateBlue" x:Name="ellipse1" />
</Canvas>


Canvas태그에 Loaded라는 속상을 추가했다. 이 속성을 추가하면 실버라이트가 로드된 후에 자바스크립트에서 Loaded속성에 지정한 이름의 함수를 찾아서 호출한다. 당연히 자바스크립트에 silverlightOnLoad라는 이름의 함수가 정의되어 있어야 한다. 기본적인 초기화(?)는 XAML파일에서 하지만 그외에 실버라이트가 로드된 다음에 처리해야 할 것 있다면 여기서 해주면 된다.

Ellipse의 속성으로 x:Name를 추가했다. 여기서는 x라는 네임스페이스를 사용했는데 네임스페이스는 최상위 Canvas태그 내에 지정되어 있다. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 의 코드가 네임스페이스를 지정하는 부분이고 Name를 사용하려면 이 부분이 지정되어 있어야 한다.



이제 자바스크립트로 핸들링을 해야 하는데 어느 것이나 마찬가지듯이 핸들링을 하려면 하기전에 일단 엘레먼트를 선택해야 한다. 어떤걸 가지고 핸들링 할건지 선택해야 머 핸들링하든지 말든지 할것 아닌가...

JavaScript

function silverlightOnLoad(sender, args) {
    alert("sivlerlight has Loaded");
            
    var element = document.getElementById("silverlightControl").content.root.Children.GetItem(0);
    //var element = sender.gethost().content.root.Children.GetItem(0);
    //var element = sender.findname("ellipse1");
    alert(element);
}


위의 함수를 넣으면 실버라이트 객체가 로딩됨과 동시에 sivlerlight has Loaded라는 메시지가 출력된다.  loaded함수는 2개의 object파라미터를 넘겨받는다. sender와 eventArgs인데 sender는 말 그대로 함수를 호출한 객체이고 eventArgs는 안써봐서 솔직히 잘 모르겠는데 MSDN에는 "This parameter is always set to null"라고 나타난다. ㅡ..ㅡ 위의 소스에서 sender는 Canvas가 된다.





그 다음에 XAML에 있는 Ellips 객체를 다루기 위해서 객체를 찾아야 한다. 4,5,6번줄은 모두 같은 결과가 나온다. 3가지 방법중(내가 알고 있는...) 편한 방법을 사용하면 된다.

실버라이트객체의 content에 root가 최상위 Canvas이다.(xaml파일에서 최상위에 볼수 있는 Canvas태그. 최상위 Canvas라고 한 것은 Canvas안에 또 Canvas가 들어갈 수 있기 때문이다.) 이 최상위 Canvas의 자식들(Children)중에서 GetItem을 통해서 원하는 객체를 찾아낼 수 있다.

4번 줄은 실버라이트객체를 통창적인 자바스크립트 코드를 이용해서 찾았다. 이전 포스팅의 html소스를 보면 실버라이트를 불러오는 object태그의 이름을 silverlightControl라고 준 것을볼수 있고 그냥 그 Object태그를 찾아온 것이다.
5번줄은 getHost() 메서드를 이용한 것이다. 실버라이트의 어떤 오브젝트에서도 getHost()를 사용하면 최상위 실버라이트객체를 얻어낼 수 있다. 솔직히 여기서는 sender가 Canvas이기 때문에 sender.gethost().content.root로 Canvas를 찾은 것은 다시 올라갔다가 원래 위치로 돌아온 좀 멍청한 짓이긴 한데 그냥 이런식으로 찾는다는 것을 알기 위해서...
6번줄은 제일 많이 사용하지 않을까 싶은데 sender의 객체로 findname()를 사용해서 해당이름의 엘레먼트를 찾아온 것이다. 자바스크립트의 document.getElementByID()처럼 직관적이다. GetItem()같은 경우는 위치가 바뀌면 소스도 바꾸어 주어야 하기 때문에.... findname()메서드는 어떤 Dependency Object에서라도(Dependency Object는 모든 실버라이트 Object의 최상위 객체이다.) 그 xaml의 엘리먼트를 찾아올 수 있다.

3가지중 어떤것을 쓰던지 간에 위코드에서는 alert메시지로 "Ellipse"가 튀어나온다.






그럼 이제 다룰 엘리먼트를 찾았으니까 먼가 해야지. Ellipse를 클릭하면 Rectangle가 생기도록 해보자. 위 함수의 마지막줄에 아래 코드를 추가하자.

element.AddEventListener("MouseLeftButtonDown", createRectangle);

MSDN에 보면 AddEventListener에 대한 정의가 다음과 같이 나온다.

object.AddEventListener(eventName, functionReference)
첫번째 파라미터는 이벤트이름이고 두번째가 해당이벤트에서 실행할 참조함수이다. 해당 object에서 eventName가 발생하면 functionReference()를 실행하는 것이다. eventName의 종류에 대해서는 해당 MSDN을 참고하면 된다. 즉 위의 코드는 Ellipse를 마우스 왼쪽클릭하면 createRectangle()를 실행하라는 뜻이다.

JavaScript

function createRectangle(sender, args) {
    var obj = document.getElementById("silverlightControl");
            
    var rect = obj.content.createFromXaml("<Rectangle />");
    rect["Canvas.Left"] = 150;
    rect["Canvas.Top"] = 10;
    rect.Width = 100;
    rect.Height = 100;
    rect.Stroke = "red";
    rect.Fill   = "SlateBlue";
    rect.StrokeThickness   = "5";

    obj.content.root.children.add(rect);
}


silverlightObject.content.CreateFromXaml(xamlContent)를 이용해서 XAML에 Rectangle엘레먼트를 추가하고 속성값을 할당한다. 그리고 add()함수를 이용해서 Rectangle엘리먼트를 추가하는데 여기서는 최상위 Canvas에 추가할 것이므로 document.getElementById("silverlightControl").content.root.children에다가 add를 해준다. 이렇게 해주면 Ellipse를 클릭했을때 Rectangle이 화면에 나타난다.


물론 이건 자바스크립트로 다루는 걸 익히기 위해서 이렇게 한것이지 동적으로 자바스크립트에서 다 생성할 필요없이 메타데이터의 역할인 XAML에서 생성하는 것이 훨씬 좋은 방법이다. 그게 메타의 역할이니까...

[DEV]Silverlight 1.0 시작하기..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

지난 주 부터 실버라이트 교육을 받고 있다. 가끔 회사에서 직장인 환급 교육관련해서 메일이 오곤 했는데 그닥 눈에 띄는 것도 없고 교육에 대한 자세한 내용도 없고 해서 크게 신뢰할 수도 없다보니 그냥 항상 지나쳤었는데 이번 교육과정들은 웹개발쪽만 있어서 고민을 좀 했는데 마침 실버라이트 1.0/2.0 강좌가 눈에 띄어서 듣기로 했다.

어차피 내돈은 한푼도 안드는거고 주말에 시간만 좀 투자해 주면 되는거였기 때문에... ㅎㅎ 실버라이트 혹은 RIA관련 기술에 대한 관심이 계속 있었지만 다른 일에 치여서(핑계겠지만...) 시작을 전혀 못하고 있었는데 교육을 받으면 반강제(?)적으로도 하게 되고 새로운 랭귀지라서 기초만 좀 익히면 그 다음은 혼자서도 어느정도 할 수 있을 것이라고 생각을 해서 신청을 했다. 그래도 8주 주말 압박은 좀.. ㅡ..ㅡ




어쨌든 지금은 실버라이트 1.0을 배우고 있다. 내가 좀 착각하고 있던 것이 1.1을 없어지다 보니까 1.0도 신경을 안써버리게 된것.... ㅡ..ㅡ

일단 시작이니까 실버라이트 얘기를 좀 하면 MS가 작년에 RIA기술로 실버라이트1.0이라는 기술을 발표했다. 실버라이트는 웹에서 사용할 수 있는 RIA기술로서 윈도우즈 Vista가 출시되면서 등장했던 WPF의 일부기능을 추려서 실버라이트라고 내 놓은 것이다. RIA시장은 현재는 Flash/Flex가 장악하고 있다고 생각하고 있고 실버라이트가 최근에 치고 올라오고 있고 그 외에도  OpenLaszlo나 JavaFX등이 있다.



실버라이트는 브라우저별로 실버라이트 런타임만 설치하면 사용할 수 있기 때문에 플래시 플레이어처럼 어느정도 보급만 되면 불편없이 자연스럽게 사용할 수 있다. 자세한 내용은 잘 모르지만 리눅스 쪽에서도 문라이트라는 녀석이 있어서 리눅스에서도 실버라이트를 볼 수 있다.(실제로는 호환성이 어떤지 모르겠지만... 지금도 베타가 계속나오는 통에 윈도우에서도 런타임 설치에 좀 문제가 있는듯... 파폭에서 잘 설치 안될때도 많고... ㅎ)

실버라이트 1.0은 자바스크립트와 XAML로 이루어져 있다. 그래픽적인 요소들의 정보를 XAML이라는 이름의 XML로 가지고 있고 이것을 자바스크립트로 다루어서 동작하도록 할 수있다. 블랜드라는 툴을 이용해서 디자이너들은 XAML파일을 내보낼 수 있고 개발자는 XAML파일을 이용해서 비쥬얼 스튜디오로 실버라이트 개발을 할 수 있는 협업구조이다.(이런 형태의 협업은 Flex쪽에서도 거의 동일한듯....)

1.0은 내가 보기에는 발표정도의 의미가 강하다. MS가 우리 이런거 한다 하면서 시장 분위기 조성하고 준비하기 위한.... 모두가 알고 있듯이 진짜는 실버라이트 2.0에 있다. 원래는 1.0을 출시하고 올해 1.1을 출시하려고 했지만 MS에서 준비하다보니 1.1의 분량이 너무 많아서 1.1의 이름은 2.0으로 변경하였다. 2.0에서는 C#을 포함하여 여러가지 언어를 지원하고(정확한 지원 언어에 대해서 못찾겠네) 1.0에서 안되던 많은 부분을 지원하고 있어서 많은 사람들이 기대를 하고 있고 현재 Beta 2까지 나와있는상태이다.





일단 실버라이트를 돌려보자. 새로운 언어를 만나면 시작이 Hello World이듯이 실버라이트도 일단 띄워야 멀 하든지 말든지 할 것 아닌가. 현재 실버라이트 1.0에 대해서만 배우고 있는 관계로 일단 1.0에 대해서만 얘기한다. 2.0은 추후에....

Html

<object type="application/x-silverlight" id="silverlightControl" width="300" height="300">
    <param name="source" value="XMLFile.xaml"/>
    <param name="background" value="#1b2d3d" />
    <param name="onError" value="onSilverlightError"/>
</object>


Html파일안에 위처럼 Object태그로 이용해서 삽입할 수 있다.  background속성은 페이지의 배경색과 맞추기 위해서 넣은 속성이다. source 프로퍼티로 XAML파일을 지정해 준다. 어떤 내용을 어떻게 보여줄 지에 대한 정보를 답고 있다. 여기서는 간단한 도형만 보여준다.

Xml

<Canvas xmlns="http://schemas.microsoft.com/client/2007"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Ellipse Height="200" Width="200" Stroke="Black" StrokeThickness="10" Fill="SlateBlue" />
</Canvas>


위의 XAML파일은 Silverlight 1.0 QuickStarts에서 가져왔다. XAML에 대한 내용을 작성하기는 양도 많고 어디서 부터 해야할 지도 몰라서...



물론 실버라이트를 보려면 실버라이트 런타임이 설치 되어 있어야 하고 실버라이트가 설치되어 있지 않을때 자동적으로 인스톨링크가 연결된다거나 하는 처리는 되어 있지 않다. 실버라이트를 설치하려면 실버라이트 설치페이지를 통해서 설치할 수 있다. 책에는 Object태그로 실버리아트를 임베드하는 것은 사파리에서는 돌아가지 않아서 embed태그를 써야한다는데 런타임이 2.0으로 업데이트되서인지 지금은 object태그로 4대브라우저(IE, 파이어폭스, 오페라, 사파리)에서 다 잘 돌아간다.


덧) 이것저것 배우고 있기는 한데 아직 정리가 안되서 포스팅하기가 쉽지 않네....