요즘 박스마일, 공도님, 이과장님과 함께 뭔가를 만들고 있는데,
실버라이트 어플리케이션을 Full Screen모드의 키오스크 스크린처럼
사용할 필요가 있어서 이런 저런 방법을 궁리하던 중...
(Need : 전체화면으로 작동하고, 리부트 시에도 자동으로 시작)

공도님이나 김대우과장님께서는,
브라우저컨트롤을 하나 품은 Full Screen Size 윈폼 어플리케이션을 제안하셨고...

저는 실버라이트가 명색이 크로스플랫폼을 지향하는데,
것보단 이런 방법을 간단히 써보자고 제안했어요.
(사실 이 프로젝트의 제한조건에는 크로스플랫폼은 고려할 필요가 없었습니다만 ^^;;;)

인터넷 익스플로어에서
- 시작페이지를 실버라이트 어플리케이션 URL로 설정합니다.
- 상태표시줄을 감추고,
- F11을 누른 다음,
- 종료합니다.

이 상태가 저장된 레지스트리 파일을 내보내기 하여 만들어 놓고.

이 레지스트리 파일을 등록하고,
인터넷 익스플로어를 작동시키는 cmd 파일을 생성하여
시작 프로그램 항목에 추가합니다.

공도님과 열심히 작업을 하고 있을 때,
이과장님께서 다른 간단한 방법이 있다는 것을 전해듣고 경악...
저만 모르고 있었던 것은 아닌지 걱정되네요. ^^

실행창에서 아래와 같이 입력하면 FlickrFinder가 Full Screen으로 키오스크모드로 뜹니다.

iexplore -k shiverlight.net/Demos/FlickrFinder

통짜로 디자인된 프로덕트를 만드실 때 유용할 것 같습니다.

다음 샘플파일은 테스트용 보너스! 클릭해서 바로 실행해 보세요.

[샘플파일]


이런식으로 cmd파일 형태로 만들어서 시작프로그램에 등록해 놓으면 컴퓨터를 리부트해도 오케이!


 

이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : kiosk, Silverlight, 실버라이트, 키오스크, 통짜

  1. 흠..

    한창 채널 서비스 유행할떄... 4.0인가 부터 있던 기능인데.. ㅡㅡ;

    | 2008/05/20 11:58 | PERMALINK | EDIT | REPLY |
  2. BlogIcon 길버트

    아, 그랬군요! 정말 오래된 전통을 가진 기능이네요. ^^

    | 2008/05/21 09:06 | PERMALINK | EDIT | REPLY |
코멘트를 남겨 주세요. (Write your message and submit)

Add Silverlight Link 사용 시의 팁.

Posted 2008/01/23 00:17 by 길버트
Silverlight 어플리케이션을 개발할 때 Cross Domain 문제를 회피하여 디버깅하기 위해서,
ASP.NET 웹 응용프로그램, ASP.NET 웹 서비스 응용프로그램, AJAX 1.0 - Enabled ASP.NET 2.0 웹 응용프로그램 등의
Web 템플릿 프로젝트를 새로 추가하고 [Add Silverlight Link]하여 사용하게 됩니다.

이때, 실버라이트 프로젝트 중,
Silverlight.js, TestPage.html, TestPage.html.js 파일은 수동으로 복사해주곤 하죠?

또, 세 파일 중 어떤 파일이 수정되면 그 파일을 또 다시 복사 해줘야 적용이 되곤했죠?

Silverlight 프로젝트에서 Silverlight.js, TestPage.html, TestPage.html.js 세 파일에 대해 속성의 [빌드 작업] 항목을 내용(Content)으로 설정하시면 편해 집니다.

사용자 삽입 이미지

Build 할 때마다 Silverlight 프로젝트의 세 파일이 Web 프로젝트에 업데이트 될 뿐만 아니라,
'게시'를 할 경우에도 문제없이 함께 게시됩니다. (= 수동으로 복사를 해줄 필요가 없어집니다.)

이미 많은 분들이 알고 계시겠지만, 아직 모르셨던 분들께 도움이 되었으면 좋겠습니다.


이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : AddSilverlightLink, RIA, Silverlight, 실버라이트,

  1. BlogIcon 이과장

    좋은 팁 잘봤습니다. ^^

    | 2008/01/23 09:10 | PERMALINK | EDIT | REPLY |
코멘트를 남겨 주세요. (Write your message and submit)

[엉뚱한실험6] Silverlight & HTTP Referer

Posted 2007/12/26 17:48 by 길버트

사용자는 대체 어느 링크를 타고 우리 웹사이트에 방문하셨을까?
이걸 알려주는 HTTP Referer라는 것이 있죠?

근데 과연 실버라이트 객체에 HtmlPage.Navigate로 구현한 링크를
타고 들어온 사용자로 부터도 HTTP Referer 정보를 얻을 수 있을까요?
이번 실험은 이 궁금증을 해소해 보겠습니다.

일단 제 Linux 웹서버에 PHP로 HTTP Referer와 Browser 정보를
화면에 출력해 주는 페이지를 하나 작성했습니다.

http://twosomeplace.net/test/Referer.php

<style>
 body, td { font-size:12px; }

 .Info { border : 1px solid #E0E0E0;}
 .Info td { padding:5px;border : 1px solid #E0E0E0;}
</style>

<table width="600" class="Info" cellspacing="0">
 <tr>
  <td>Referer</td>
  <td><?=$_SERVER['HTTP_REFERER']?>&nbsp;</td>
 </tr>
 <tr>
  <td>Browser</td>
  <td><?=$_SERVER['HTTP_USER_AGENT']?></td>
 </tr>
</table>

그리고 아래와 같은 실버라이트 페이지를 하나 만들어 보았습니다.

http://shiverlight.net/test/Referer/

사용자 삽입 이미지

Test HTTP Referer라고 쓰여있는 버튼을 누르시거나,
Call Referer.php라고 쓰여있는 HTML Hyper Link를 누르시면,
http://twosomeplace.net/test/Referer.php를 새창으로 띄워서 결과를 확인시켜 줍니다.

(위 링크를 직접 눌러 보시면 이 글에 해당되는 URL이 Referer로 화면에 뜨는 것도 확인하실 수 있으실 겁니다.)


테스트 결과

1. 실버라이트 버튼을 눌렀을 때

사용자 삽입 이미지
Referer는 알 수 없고, Browser 정보는 정상적으로 보입니다.


2. HTML 하이퍼링크를 눌렀을 때

사용자 삽입 이미지
Referer와 Browser 정보 모두가 정상적으로 보입니다.


결론

실버라이트는 흔적(HTTP Referer)을 남기지 않는다...

그렇군요...

이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : HTTP Referer, Silverlight, 실버라이트,

코멘트를 남겨 주세요. (Write your message and submit)

Silverlight와 WebService(.NET 3.5) 연동하기

Posted 2007/12/26 10:35 by 길버트

1. 샘플 프로젝트 만들기

일단 솔루션에 .Net Framework 3.5 기반의 Silverlight Project를 먼저 생성하시고,

사용자 삽입 이미지

이어서 Web프로젝트 형식의 'ASP.NET 웹서비스 응용 프로그램 템플릿 프로젝트를 추가합니다.

사용자 삽입 이미지

WebSvc3_5 프로젝트에 오른쪽 클릭을 하고 'Add Silverlight Link'를 실행합니다.

사용자 삽입 이미지

아래와 같은 창이 뜨면 OK를 누릅니다.

사용자 삽입 이미지

이 과정을 거치고 나면 WebSvc3_5 프로젝트에 Page.xaml과 Silverlight 프로젝트의 빌드 결과물(.dll)들이 참조되게 됩니다.

사용자 삽입 이미지

Silverlight 프로젝트의 Silverlight.js 파일과 TestPage.html (TestPage.html.js파일 포함)파일을
WebSvc3_5 프로젝트에 복사해 줍니다.

WebSvc3_5 프로젝트 이름에 오른쪽 클릭을 하고 '시작 프로젝트로 설정'을 실행합니다.
WebSvc3_5 프로젝트 내의 TestPage.html 파일에 오른쪽 클릭을 하고 '시작 페이지로 설정'을
실행합니다.

위 액션의 의도가 궁금하신 분은 공도님의 포스트

http://gongdo.tistory.com/97 중 '웹 프로젝트와 Silverlight 프로젝트를 함께 디버깅'

파트를 참고하십시오. 안 궁금하신 분은 패스!


솔루션 탐색기 트리에서 Service1.asmx 파일을 더블클릭하여
Service1.asmx.cs 파일을 아래와 같이 편집합니다.

using System;
using System.Data;
using System.Linq;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Xml.Linq;
namespace WebSvc3_5
{
    /// <summary>
    /// Service1의 요약 설명입니다.
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    // ASP.NET AJAX를 사용하여 스크립트에서 이 웹 서비스를 호출하려면 다음 줄의 주석 처리를 제거합니다.
    [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {
        [WebMethod]
        public string HelloWorld()
        {
            return "Happy New Year!";
        }
    }
}

[System.Web.Script.Services.ScriptService]에 적용되어 있던 주석 하나만 풀어주면,
바로 Silverlight의 비하인드 코드를 통해 직접 연동할 수 있는 웹서비스 클래스가 됩니다.

Service1.asmx 파일에 오른쪽 클릭하고 '브라우저로 보기'를 실행하여,
URL을 클립보드에 복사해 둡니다.

저의 경우에는 http://localhost:56997/Service1.asmx 였습니다.
자 그럼 그창을 닫습니다.

주의) 나중에 웹에 게시할 때는 웹서비스가 게시된 웹상의 URL로 웹참조를
변경해 주셔야 합니다.



3. 웹 참조 추가

Silverlight 프로젝트에 오른쪽 클릭을 하고 '웹 참조 추가'를 실행합니다.

사용자 삽입 이미지

1. 클립보드에 복사한 URL을 붙여넣기 하고 '이동' 버튼을 누릅니다.
2. 웹 참조 이름을 변경합니다.
3. 참조 추가 버튼을 누릅니다.

이제 이 실버라이트 프로젝트 내의 모든 비하인드 코드에서 mySvc란 이름으로
웹 서비스에 접근이 가능해졌습니다.


4. 실버라이트 프로젝트에 웹서비스를 참조하는 샘플 코드 구현

웹서비스에서 받아 온 문자열을 화면에 보여 주기 위해 Page.xaml 파일을 Blend에서
조금 변경합니다.

사용자 삽입 이미지

크리스마스에 어울리는 빨간 글씨를 가진 TextBlock을 _tbMessage란 이름으로 추가합니다.

마지막으로 Page.xaml.cs에 손을 댑니다.

public void Page_Loaded(object o, EventArgs e)
{
    // Required to initialize variables
    InitializeComponent();

    // 웹 서비스의 HelloWorld 메서드를 실행하여 가져온 문자열을 화면에 표시
    mySvc.Service1 svc = new mySvc.Service1();
    _tbMessage.Text = svc.HelloWorld();
}


5. 테스트

자 이제 F5를 눌러 실행을 해봅니다.

사용자 삽입 이미지


웹 서비스에서 받아온 문자열이 화면에 잘 표시되는 것을 확인할 수 있었습니다.

이제 재미있고 유익한 웹 서비스를 구현하여 즐기는 일만 남았군요!

감사합니다.


6. 프로젝트 소스


필요하신 분은 다운받으십시오.
이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : .Net Framework 3.5, ajax, Silverlight, WebService연동, 실버라이트,

  1. 이지홍9

    전 add 실버라이트 링크라는 메뉴가 없는데 어떻하죠?
    visual studio 2008에 실버라이트 2.0 입니다.

    | 2008/03/11 14:54 | PERMALINK | EDIT | REPLY |
  2. 이지홍9

    js랑 테스트 페이지가 안생깁니다.
    도와주세요.

    | 2008/03/11 15:04 | PERMALINK | EDIT | REPLY |
  3. BlogIcon 길버트

    제 글은 실버라이트 1.1에 해당하는 내용입니다.

    실버라이트2에서는 프로젝트 생성 시,
    기본 옵션으로 웹어플리케이션 프로젝트를 동시에 생성할 수가 있구요.

    이때 생긴 [프로젝트명]_Web란 이름의 웹어플리케이션 프로젝트 쪽의 파일 구성을 유심히 보시면,
    js랑 테스트 페이지 대신에 [프로젝트명]TestPage.aspx파일과 [프로젝트명]TestPage.html 파일이 생깁니다.
    둘 중 테스트 하고 싶으신 것을 '시작 페이지로 지정'하시고 실행하시면됩니다.

    [프로젝트명]TestPage.aspx에서는 asp:Silverlight 컨트롤에 의해서 실버라이트가 호스팅 되고,
    [프로젝트명]TestPage.html에서는 object 태그에 의해서 실버라이트가 호스팅 되고 있는 것을
    확인하실 수 있습니다.

    실버라이트 2에서는 TestPage.html.js 같은 것이 필요없게 되었습니다.

    | 2008/03/11 18:59 | PERMALINK | EDIT | REPLY |
코멘트를 남겨 주세요. (Write your message and submit)

Silverlight와 WebService(.NET 2.0) 연동하기

Posted 2007/12/25 13:34 by 길버트

1. 서론 (준비사항)

.Net Framework 3.5 기반으로 생성한 WebService와 Silverlight 연동하기는
누워서 떡먹기인데, 웹호스팅 업체들이 .Net Framework 3.5를 지원하는
서비스를 아직 내놓지 않고 있죠? (비싼 돈 내고 서버 호스팅을 하는 수 밖에...)

그래서 현재 시점에서는 .Net Framework 2.0 기반의 WebService와 함께 하는 것이 손쉬운 길입니다.

.Net Frameworks 2.0 기반에서 Silverlight와 연동하기 위해서는 AJAX의 도움이 필요합니다.
일단 Visual Studio 2008은 설치되어있으시다고 가정하면, 다음과 같은 것들을 추가로 설치하셔야 합니다.

- ASP.NET 2.0 AJAX 1.0 Extensions 1.0
- Microsoft ASP.NET 2.0 AJAX Templates for Visual Studio 2008

설치 후 Visual Studio 2008을 구동시켜 새 프로젝트 만들기를 시도해 보면,
Web 프로젝트 형식의 .NET Framework 2.0 용 템플릿에 무엇인가 새로 추가되어 있는 것을
발견하실 수 있습니다.

사용자 삽입 이미지
AJAX 설치 전

사용자 삽입 이미지
AJAX 설치 후

AJAX 1.0-Enabled ASP.NET Web Application이 새로 추가되었군요!


2. 샘플 프로젝트 만들기

일단 솔루션에 .Net Framework 3.5 기반의 Silverlight Project를 먼저 생성하시고,

사용자 삽입 이미지

이어서 .Net Framework 2.0 기반의 'AJAX 1.0-Enabled ASP.NET Web Application' 프로젝트를 하나 추가합니다.

사용자 삽입 이미지

사용자 삽입 이미지

Web Application 프로젝트에 오른쪽 클릭을 하고 'Add Silverlight Link'를 실행합니다.

사용자 삽입 이미지

위와 같은 창이 뜨면 OK를 누릅니다.
이 과정을 거치고 나면 WebSvc2_0 프로젝트에 Page.xaml과 Silverlight 프로젝트의 빌드 결과물(.dll)들이 참조되게 됩니다.

사용자 삽입 이미지

Silverlight 프로젝트의 Silverlight.js 파일과 TestPage.html (TestPage.html.js파일 포함)파일을
AJAX Web Application 프로젝트에 복사해 줍니다.

WebSvc2_0 프로젝트 이름에 오른쪽 클릭을 하고 '시작 프로젝트로 설정'을 실행합니다.
WebSvc2_0 프로젝트 내의 TestPage.html 파일에 오른쪽 클릭을 하고 '시작 페이지로 설정'을
실행합니다.

위 액션의 의도가 궁금하신 분은 공도님의 포스트

http://gongdo.tistory.com/97 중 '웹 프로젝트와 Silverlight 프로젝트를 함께 디버깅'

파트를 참고하십시오. 안 궁금하신 분은 패스!


사용자 삽입 이미지

WebSvc2_0에 오른쪽 클릭을 하고 '추가 - 새 항목'을 통해서,
웹서비스를 하나 추가합니다. 위 그림에서 WebService1.asmx.

솔루션 탐색기 트리에서 WebService1.asmx 파일을 더블클릭하여
WebService1.asmx.cs 파일을 아래와 같이 편집합니다.

using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Web.Script.Services;

namespace WebSvc2_0
{
    /// <summary>
    /// WebService1의 요약 설명입니다.
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    [ScriptService]
    public class WebService1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Merry Christmas!";
        }
    }
}


웹서비스 클래스에 [System.Web.Script.Services.ScriptService]가 선언이 되어있어야,
Silverlight의 비하인드 코드를 통해서 직접 연동할 수 있습니다.

WebService1.asmx 파일에 오른쪽 클릭하고 '브라우저로 보기'를 실행하여,
URL을 클립보드에 복사해 둡니다.

저의 경우에는 http://localhost:49573/WebService1.asmx 였습니다.
자 그럼 그창을 닫습니다.

주의) 나중에 웹에 게시할 때는 웹서비스가 게시된 웹상의 URL로 웹참조를
변경해 주셔야 합니다.



3. 웹 참조 추가

Silverlight 프로젝트에 오른쪽 클릭을 하고 '웹 참조 추가'를 실행합니다.

사용자 삽입 이미지

1. 클립보드에 복사한 URL을 붙여넣기 하고 '이동' 버튼을 누릅니다.
2. 웹 참조 이름을 변경합니다.
3. 참조 추가 버튼을 누릅니다.

이제 이 실버라이트 프로젝트 내의 모든 비하인드 코드에서 mySvc란 이름으로
웹 서비스에 접근이 가능해졌습니다.


4. 실버라이트 프로젝트에 웹서비스를 참조하는 샘플 코드 구현

웹서비스에서 받아 온 문자열을 화면에 보여 주기 위해 Page.xaml 파일을 Blend에서
조금 변경합니다.

사용자 삽입 이미지

크리스마스에 어울리는 빨간 글씨를 가진 TextBlock을 _tbMessage란 이름으로 추가합니다.

마지막으로 Page.xaml.cs에 손을 댑니다.

public void Page_Loaded(object o, EventArgs e)
{
    // Required to initialize variables
    InitializeComponent();

    // 웹 서비스의 HelloWorld 메서드를 실행하여 가져온 문자열을 화면에 표시
    mySvc.WebService1 svc = new mySvc.WebService1();
    _tbMessage.Text = svc.HelloWorld();
}


5. 테스트

자 이제 F5를 눌러 실행을 해봅니다.

사용자 삽입 이미지


웹 서비스에서 받아온 문자열이 화면에 잘 표시되는 것을 확인할 수 있었습니다.

이제 재미있고 유익한 웹 서비스를 구현하여 즐기는 일만 남았군요!

감사합니다.


6. 프로젝트 소스


필요하신 분은 다운받으십시오.
이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : .Net Framework 2.0, ajax, Silverlight, WebService연동, 실버라이트,

코멘트를 남겨 주세요. (Write your message and submit)

이번 실험은 이런 생각에서 출발합니다.

createSilverlight 함수의 isWindowless 파라미터를 "true"로 설정한 후,
실버라이트 Page의 Opacity값이나 Background 색상의 Alpha 값을 조정하면,
뒤에 놓인 HTML 엘리먼트들을 배경으로 보이면서 작동이 가능할 것인가?


(구체적으로는 HTML형태로 결과물을 보여주는 이런저런 매쉬업들을 활용하여,
실버라이트만 그 위에 살짜쿵 올려서, 뭔가를 만들 수 있지 않을까...? 하는 생각에서 출발했습니다.)

일단, Silverlight의 isWindowless 파라미터에 대해서는 공도님이 친절하게
정리해 놓은 포스트가 있으니 참고하시면 되겠습니다.

공도님이 정리한 포스트

Page.xaml은 Blend에서 아래와 같이 사이즈 400x300 짜리 디자인으로 준비하였습니다.

사용자 삽입 이미지

Page.xaml.cs에 myButton에 대해 아래 역할을 하는 이벤트를 추가해 주었습니다.

MouseEnter 이벤트에서 Page Canvas의 Opacity를 0으로 변경.
MouseLeave 이벤트에서 Page Canvas의 Opacity를 1로 복원.

TestPage.html은 아래와 같이 준비하였습니다.
Body에는 배경을 깔았습니다. z-index를 통해 div객체를 겹쳐보기 위해서
Hugeflow Logo를 2개 준비하였습니다.

<html xmlns="http://www.w3.org/1999/xhtml" >
<!-- saved from url=(0014)about:internet -->
<head>
    <title>Trying to overlap Divs using CSS (when isWindowless is true)</title>
   
    <script type="text/javascript" src="Silverlight.js"></script>
    <script type="text/javascript" src="TestPage.html.js"></script>
    <style type="text/css">
        img { border:1px solid #000000;}
        body { margin:10px 10px 10px 10px; background-image:url(bg_main.png);}

        .silverlightHost { width:400px;height:300px;}
       
        #Logo1 { position:absolute;left:15px;top:15px;z-index:1;}
        #Logo2 { position:absolute;left:150px;top:15px;z-index:3;}
       
    </style>
</head>

<body>
        <div id="Logo1">
            <a href="
http://hugeflow.com"><img src="HFLogo_snow.jpg" border="0" /></a>
        </div>
        <div id="Logo2">
            <a href="
http://hugeflow.com"><img src="HFLogo_snow.jpg" border="0" /></a>
        </div>

        <div id="SilverlightControlHost" class="silverlightHost" >
        <script type="text/javascript">
            //createSilverlight(); // 살짝 주석처리
        </script>
        </div>   
</body>
</html>

일단 이해를 돕는 그림을 만들기 위해 createSilverlight를 살짝 주석으로 막고 실행시켜 캡쳐하였습니다.

사용자 삽입 이미지

z-index가 효험을 보여 Huge Flow 로고가 2개 겹쳐있는 것을 확인하실 수 있습니다.
여기서 createSilverlight의 주석봉인을 풀어주면 다음과 같이 됩니다.

사용자 삽입 이미지

그럼 이제 TestPage.html.js (실버라이트를 호스트하는 html페이지의 비하인드 코드)에서
isWindowless: "true"를 추가해 줍니다.


function createSilverlight()
{
 Silverlight.createObjectEx({
  source: "Page.xaml",
  parentElement: document.getElementById("SilverlightControlHost"),
  id: "SilverlightControl",
  properties: {
   width: "100%",
   height: "100%",
   version: "1.1",
   isWindowless: "true",
   enableHtmlAccess: "true"
  },
  events: {}
 });
   
 // Give the keyboard focus to the Silverlight control by default
    document.body.onload = function() {
      var silverlightControl = document.getElementById('SilverlightControl');
      if (silverlightControl)
      silverlightControl.focus();
    }

}

그럼 이렇게 됩니다.

사용자 삽입 이미지

여기서 Silverlight 객체를 호스트 하기 위한 Div의 z-index를 2로 주면,
Silverlight 객체가 과연 Hugeflow의 로고 두 개 사이 계층에 껴서,
하나의 로고(z-index = 1)는 Silverlight 객체 아래로 가서 안보이게되고,
다른 하나(z-index = 3)의 Silverlight 객체 위에 그대로 보이게 될까요?

여러분 궁금하지 않으십니까?
그래서 일단 CSS를 수정하였습니다.

<html xmlns="http://www.w3.org/1999/xhtml" >
<!-- saved from url=(0014)about:internet -->
<head>
    <title>Trying to overlap Divs using CSS (when isWindowless is true)</title>
   
    <script type="text/javascript" src="Silverlight.js"></script>
    <script type="text/javascript" src="TestPage.html.js"></script>
    <style type="text/css">
        img { border:1px solid #000000;}
        body { margin:10px 10px 10px 10px; background-image:url(bg_main.png);}
        .silverlightHost { width:400px;height:300px;position:absolute;z-index:2;}
       
        #Logo1 { position:absolute;left:15px;top:15px;z-index:1;}
        #Logo2 { position:absolute;left:150px;top:15px;z-index:3;}       
    </style>
</head>

<body>
        <div id="Logo1">
            <a href="http://hugeflow.com"><img src="HFLogo_snow.jpg" border="0" /></a>
        </div>
        <div id="Logo2">
            <a href="http://hugeflow.com"><img src="HFLogo_snow.jpg" border="0" /></a>
        </div>
        <div id="SilverlightControlHost" class="silverlightHost" >
        <script type="text/javascript">
            createSilverlight();
        </script>
        </div>   
</body>
</html>

겹치게 하기 위해서 position은 absolute로 설정하고, z-index를 2로 설정하였습니다.
결과 보시죠!

사용자 삽입 이미지

무리없이 잘됩니다. ^^;;

그럼 오늘 시험의 하이라이트 Silverlight Page의 Opacity나 Background의 Alpha값을
조정해서 Silverlight 객체 뒤로 숨어버린 Logo 이미지나, 배경을 볼 수 있을까요?
자, 아까부터 출연해서 기다리고 있던 저 크고 검은 버튼에 손을 대보겠습니다.

사용자 삽입 이미지

이런 실망하셨죠?
혹시나 해서 Page.xaml에 가서 Background 물을 빼보고 다시 해보았습니다만,
마찬가지 결과를 보여줍니다.

그럼 방법이 전혀 없느냐?

boxmile이 Silverlight 공식포럼에서 발견하고 저에게 알려준 방법이 있습니다.

포럼원문 : http://silverlight.net/forums/t/6267.aspx

방법이 다음과 같이 간단합니다.

TestPage.html.js의 createSilverlight 함수에 다음 파라미터를 추가하라.
   
isWindowless : "true"
background : "#00FFFFFF"


(각 파라미터 끝에 , 빼먹지 않도록 조심하세요.)

실제 코드에 적용

function createSilverlight()
{
 Silverlight.createObjectEx({
  source: "Page.xaml",
  parentElement: document.getElementById("SilverlightControlHost"),
  id: "SilverlightControl",
  properties: {
   width: "100%",
   height: "100%",
   version: "1.1",
   isWindowless: "true",
   
background: "#00FFFFFF",
   enableHtmlAccess: "true"
  },
  events: {}
 });
   
 // Give the keyboard focus to the Silverlight control by default
    document.body.onload = function() {
      var silverlightControl = document.getElementById('SilverlightControl');
      if (silverlightControl)
      silverlightControl.focus();
    }

}

이런 처방을 한 이후에 Page의 배경색이나 Opacity를 조정해보면,
원하는 대로 동작하는 것을 확인해 보실 수 있습니다.

첫번째로, Page의 배경색이 없는 경우

사용자 삽입 이미지

로고 사이에 찡긴 버튼을 확인하실 수 있습니다.
(좀더 극적인 효과를 위하여, 버튼의 모양/크기/위치를 조정하였습니다.)

두번째로, 배경색을 주고 Alpha 값을 반 정도(128) 감소시킨 경우,

사용자 삽입 이미지

반투명으로 잘 보이는 것을 확인할 수 있었습니다.


부록 1. 한편 Flash에는?

Flash에 보면 유사한 개념으로 wmode 파라미터가 있습니다.
wmode

- opaque : 불투명
- transparent : 투명

opaque로 설정 시 HTML 객체가 Flash 위에 올라올 수 없습니다. 한편, transparent로
설정 시에는 HTML 객체가 Flash 위에 올라오게 할 수도 있고, 배경이 없는 경우 아래에 있는 HTML 객체를 그대로 투과하여 보여 줄 수 있습니다.

공신닷컴 메인페이지를 작업하면서 적용해보니 FireFox 2.x에서 제대로 작동을 안하는 등,
아직 Cross Browsing 문제가 남아있는 것을 확인하였습니다.


긴 실험결과 봐 주셔서 감사합니다.
이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : createSilverlight, isWindowless, RIA, Silverlight, Transparent Background, 실버라이트, , 투명한배경, 휴즈플로우

  1. BlogIcon 길버트

    티스토리 에디터 자동링크 이상하네요. @_@

    | 2007/12/20 20:32 | PERMALINK | EDIT | REPLY |
  2. onseed

    상세하고 이해하기 쉬운 정리..감사합니다..블로그에 담아갈께요..허락해주세요..

    | 2008/01/24 19:38 | PERMALINK | EDIT | REPLY |
  3. BlogIcon 길버트

    물론 허락해 드리겠습니다.
    좋은 하루 되세요.

    | 2008/01/24 20:29 | PERMALINK | EDIT |
  4. 이진석

    잘 읽었습니다. :)

    | 2008/02/17 00:42 | PERMALINK | EDIT | REPLY |
코멘트를 남겨 주세요. (Write your message and submit)
사용자 삽입 이미지

'아마도 이럴 것이다...'하는 것도 한번 실험해 보고 지나갈 필요가 있다고 생각합니다.

MouseMove 이벤트를 이용하여 실험했습니다.
Transform된 상태에 따라 얻는 GetPosition값이 약간의 차이가 있습니다.

결론은 객체 기준으로 GetPosition을 하면,
어떤 Transform이 일어나던지 객체 자신의 내부에서의 상대적인 값을 반환합니다.


이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : GetPosition결과비교, RIA, Silverlight, 실버라이트, 엉뚱한실험실, , 휴즈플로우

코멘트를 남겨 주세요. (Write your message and submit)

사용자 삽입 이미지

결과는 정확하게 일치한다입니다.

이런 거 왜 해보나 싶으신 분들도 많으실 걸로 압니다만,
저는 일단 눈으로 봐야 믿는 성격이라, 죄송합니다.

말그대로 엉뚱한 실험실이었습니다!

이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : ActualWidth, RIA, Silverlight, TextBlock, 실버라이트, 엉뚱한실험실, , 휴즈플로우

코멘트를 남겨 주세요. (Write your message and submit)

Blend를 통해 User Control 추가하기

Posted 2007/12/14 13:02 by 길버트
1. 자신의 어플리케이션에 User Control을 추가하는 두가지 방법

(1) 비하인드 코드에서 동적으로 생성하는 방법

MyUserControl oControl = new MyUserControl();
Children.Add(oControl);

(2) XAML 코드에 추가하는 방법

<MyProject:MyUserControl Width="510" Height="40" Canvas.Left="402" Canvas.Top="50" x:Name="oControl"/>


위와 같은 코드를 직접 XAML 파일에 적어 넣어도 되지만,
Microsoft Blend에서 User Control을 추가하면 XAML파일에 위와 같은 코드가 자동으로 추가됩니다.

(1)번 방법은 개수가 정해지지 않고 복수개 생성될 때 유리하고,
(2)번 방법은 한 두개 생성해서 쓰면서 전체 레이아웃에 적절히 배치해야 할 경우
Microsoft Blend를 통해 디자인 수정할 수가 있어서 유리합니다.


2. Blend를 통해 User Control을 추가하기

Blend에서 User Control을 추가하기 위해서 왼쪽 툴바의 Asset Library를 클릭합니다.

사용자 삽입 이미지

그러면 Asset Library 다이얼로그가 뜹니다. 거기서 Custom Controls 탭을 선택하시면
현재 솔루션에 포함된 Blend에서 XAML형태로 추가 가능한 User Control이 표시됩니다.

사용자 삽입 이미지

(혹시 자신이 만든 User Control이 안보인다면 - 아래 글 3번을 먼저 읽으십시오.)

여기서 Canvas에 추가하고 싶은 User Control을 클릭합니다.
그러면 왼쪽 툴바에 선택한 User Control 아이콘이 추가되고,
동시에 그 User Control을 추가할 수 있는 상태가 됩니다.

디자인 영역에 마우스로 적당한 위치에 클릭하시고 드래그 하시면,
User Control이 추가됩니다.

사용자 삽입 이미지

눈에 보이는 것은 없지만, 위치, 사이즈 등은 결정해 줄 수 있습니다.

그리고 실행을 해보면 다음과 같은 User Control이 정상적으로 생성되어서 보입니다.

사용자 삽입 이미지


3. XAML형태를 통해 추가하고자 하는 User Control이 지켜야 할 사항

그렇다면 내가 만든 User Control이 (Blend를 통하든 안통하든) XAML형태로 추가되려면 어떻게 해야하느냐?

기본 생성자를 반드시 가지고 있어야 합니다.

기본 생성자는 파라미터를 하나도 받지 않는 생성자를 말합니다.
이 규칙만 지켜주면 XAML 코드를 통해서도 생성이 가능합니다.

참고)
User Control이 기본 생성자를 가지고 있지만 Blend에서 보이지 않는 경우에는
Blend의 프로젝트 탐색기에서 솔루션에 오른쪽 클릭을 하시어 "Rebuild Solution"을 한 번
실행해 주신 다음에 다시 도전하시기 바랍니다.


4. 고려할 사항

- XAML 코드로 설정된 Width, Height 등의 프로퍼티는 User Control이 생성된 이후에 설정이 됩니다.
즉, 생성자에서 Width, Height 값은 초기값을 유지하고, Loaded 이벤트 함수에서부터
XAML 코드에서 설정해준 Width, Height 값을 가지고 있습니다.

- User Control의 기타 프로퍼티들도 XAML에서 지원 가능합니다.
단순한 프로퍼티들은 정의만 해 놓아도 XAML 코드를 통해 그 값을 입력하는 것이 가능합니다.
리스트, 콜렉션 형태의 것들은 좀 더 머리를 쓰셔야 합니다.

- User Control의 이름이 바꾸었을 때, XAML 코드를 재검토 하여 변경해 줘야한다.
XAML 잘못된 User Control명이 들어가 있어도 컴파일 에러가 발생하지 않기 때문이다.

- 인텔리센스가 아직! 도와주지 않습니다.

이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : Blend, RIA, Silverlight, UserControl, XAML, 실버라이트, , 유저컨트롤

  1. 비밀댓글 입니다

    | 2007/12/14 15:18 | PERMALINK | EDIT | REPLY |
코멘트를 남겨 주세요. (Write your message and submit)
Random.Next(int minValue, int maxValue) 함수를 사용하면서,

직관적으로 당연히 minValue 와 maxValue를 포함하면서 그 사이의 정수가 나오는 줄 알고 써왔습니다.


그렇게 알고 살다가, 살다가... 오늘 어떤 프로그램에서 아래와 같은 코드를 구현한 후,

int nIndex = myRandom.Next(0, 4);

결과를 테스트 하는데, 죽어도 4가 안나오는 것입니다.

혹시나 해서 F1을 눌러 MDSN Library를 보니, 아래와 같이 기술되어 있었습니다.

매개 변수

minValue
형식: System..::.Int32

반환되는 난수의 하한(포함)입니다.

maxValue
형식: System..::.Int32

반환되는 난수의 상한(제외)입니다. maxValueminValue보다 크거나 같아야 합니다.


4를 보고 싶으면, 아래와 같이 해야하는 것입니다.

int nIndex = myRandom.Next(0, 5);

옛말이 틀리지 않았습니다.

"아는 메서드도 두들겨 보고 써라."

이올린에 북마크하기(0) 이올린에 추천하기(0)

Tag : C#, Random.Next메서드

코멘트를 남겨 주세요. (Write your message and submit)