시작일과 종료일 기간 체크 및 날짜 등분

이전 코드에서는 시작일과 종요일 기간이 나눈 등분기간 보다 짧을때

가령 등분이 15일인데 실제 기간은 4일일경우 4일 이후는 같은 값이

계속 나오는 문제가 있었습니다. 이와 같은 경우는 단순하게 1씩 더해서

시작일과 종료일 기간만큼만 화면에 출력하고 종료하는 로직으로 변경하였습니다.







using System;
using System.Collections.Generic;
using System.Text;

namespace DurationDay
{

    /// 
    /// 어떤 시작과 종료 되는 시점의 기간(duration)을 일정 지정한 간격만큼
    /// 배분하는 로직
    /// 
    class Program
    {
        static void Main(string[] args)
        {
            // 시작/종료일
            string fromDate = "2012-05-01";
            string toDate = "2012-05-05";
            int portion = 0;
            int mod = 0;

            int addCount = 0;
            int i = 0;
            int addDay = 0;

            DateTime day = new DateTime();

            // 시작/종료일 날짜형 변환
            DateTime fromDt = DateTime.Parse(fromDate);
            DateTime toDt = DateTime.Parse(toDate);

            // 날짜 기간 (분모)
            int duration = DayCount(fromDt, toDt);

            // 기간 등분 (분자)
            int numerator = 14;

            if (duration > numerator)
            {
                // 날짜 사이의 간격(몫)
                portion = duration / numerator;

                // 나머지
                mod = duration % numerator;

                // 기간 등분만큼 Loop 반복
                do
                {
                    // 나머지 수 만큼 앞에서부터 +1을 더함
                    if (i <= mod)
                    {
                        addCount = i * (portion + 1);
                        addDay = portion + 1;
                        day = fromDt.AddDays(addCount);
                    }
                    else
                    {
                        addCount += (portion);
                        addDay = portion;
                        day = fromDt.AddDays(addCount);
                    }

                    i++;

                    Console.WriteLine("NO : {0} : {1} / {2} / {3}",
                                       i >= 10 ? i.ToString() : "0" + i.ToString(),
                                       day.ToString("yyyy-MM-dd"), addCount, addDay);
                } while (i <= numerator);
            }
            else
            {
                // 시작일과 종료일의 기간이 등분한 날짜보다 작을때...
                // 전체 날짜 표시
                for (; i <= duration; i++)
                {
                    numerator = addCount;

                    addCount = i;
                    addDay = addCount;
                    day = fromDt.AddDays(addCount);
                    int disCnt = i + 1;

                    Console.WriteLine("NO : {0} : {1} / {2} / {3}",
                                    disCnt >= 10 ? disCnt.ToString() : "0" + disCnt.ToString(),
                                    day.ToString("yyyy-MM-dd"), addCount, addDay);
                }
            }

            Console.WriteLine("duration : {0}", duration);
            Console.WriteLine("numerator : {0}", numerator);
            Console.WriteLine("portion : {0}", portion);
            Console.WriteLine("mod : {0}", mod);


            Console.ReadLine();
        }

        static int DayCount(DateTime fromDt, DateTime ToDt)
        {
            TimeSpan ts = ToDt - fromDt;
            return ts.Days;
        }
    }
}






기간이 짧을경우

 

기간이 긴경우

 

 

DurationDay.zip

 

시작과 종료일 날짜 간격 구하는 로직

간만에 C# 코드 하나 올립니다. 굉장히 오랜 시간동안 개발 관련 포스팅을 하지 않았는데
앞으로 기회가 또 있을지 모르겠지만 좋은 코드가 있으면 공유하겠습니다.

그리고 좋은방법 있으면 의견 주세요.....

 

using System;
using System.Collections.Generic;
using System.Text;

namespace DurationDay
{

    /// 
    /// 어떤 시작과 종료 되는 시점의 기간(duration)을 일정 지정한 간격만큼
    /// 배분하는 로직
    /// 
    class Program
    {
        static void Main(string[] args)
        {
            // 시작/종료일
            string fromDate = "2009-05-04"; 
            string toDate = "2012-05-03";

            // 시작/종료일 날짜형 변환
            DateTime fromDt = DateTime.Parse(fromDate); 
            DateTime toDt = DateTime.Parse(toDate);     

            // 날짜 기간 (분모)
            int duration = DayCount(fromDt, toDt);

            // 기간 등분 (분자)
            int numerator = 19;

            // 날짜 사이의 간격(몫)
            int portion = duration / numerator;

            // 나머지
            int mod = duration % numerator;

            Console.WriteLine("duration : {0}", duration);
            Console.WriteLine("numerator : {0}", numerator);
            Console.WriteLine("portion : {0}", portion);
            Console.WriteLine("mod : {0}", mod);

            int add = 0;
            int i = 0;
            int addDay = 0;

            DateTime day = new DateTime();

            // 전체 날짜 기간이 20일 이상일 경우만 간격지정
            if (duration > numerator)
            {
                // 기간 등분만큼 Loop 반복
                do
                {
                    if (i == 0) // 시작일
                    {
                        day = fromDt;
                        add = 0;
                        addDay = 0;
                    }
                    else if (i == numerator) // 종료일
                    {
                        day = toDt;
                        add += portion;
                        addDay = portion;
                    }
                    else if (i >= 1 && i <= 19)
                    {
                        // 나머지 수 만큼 앞에서부터 +1을 더함
                        if (i <= mod)
                        {
                            add = i * (portion + 1);
                            addDay = (portion + 1);
                            day = fromDt.AddDays(add - 1);
                        }
                        else
                        {
                            add += (portion);
                            addDay = portion;
                            day = fromDt.AddDays(add);
                        }
                    }

                    i++;
                    Console.WriteLine("{0} : {1} / {2} / {3}", 
                                       i >= 10 ? i.ToString() : "0" + i.ToString(), 
                                       day.ToString("yyyy-MM-dd"), add, addDay);

                } while (i <= numerator);
            }

            Console.ReadLine();
        }

        static int DayCount(DateTime fromDt, DateTime ToDt)
        {
            TimeSpan ts = ToDt - fromDt;
            return ts.Days;
        }
    }
}

 

 

 

 

DurationDay.zip

 

소스 코드는 Visual Studio 2008 (.net 3.5) 환경에서 개발되었습니다.

받으신 다음 테스트 해보시면 금방 이해되실 수 있습니다.

numerator, 시작일, 종료일 값만 변경하여 테스트 하시면 됩니다.

 

 

SilverlightTeskTop Application Program

실버라이트 데스크탑 프로그램이라고 소개되어 있는데, 실버라이트를 데스크탑 프로그램처럼 사용할 수 있다? 구글신에게 실버라이트 정보를 구걸하다가 발견한 웹사이트 입니다. 몇몇의 프로그래머가 오픈소스 형태로 진행하고 있는 프로젝트 인것 같은데요... 간단하게 사용할 수 있는 데모를 여기에 가시면 테스트 해볼 수 있습니다. 그리고 동영상으로 데모시연 하는것도 볼 수 있습니다.







메일도 보낼 수 있는 것 같습니다.

소스코드를 다운로드하여 테스트 해보고 싶으시면 여기에서 받으시면 됩니다. 단 웹사이트에 아이디, 이름, 이메일, 비밀번호의 간단한 개인정보를 입력후 가입을 해야 합니다.

※ 가입하기가 귀찮다면 직접 다운로드 CodePlex에서 다운로드 하시면 됩니다. : SilverlightDesktop 01.90.00

윈도우 비스타를 환경에서 테스트 해볼 수 있도록 설치가이드가 제공됩니다.(비스타는 프로페셔널이상에 IIS 웹서버가 설치되어 있어야 합니다.)



실버라이트 데스크탑 어플리케이션의 아키텍쳐입니다. (출처 : http://silverlightdesktop.net/Default.aspx)

Silverlight ChartBuilder 소스코드 및 데모 업데이트



데모사이트, 소스코드 다운로드

더 자세히 보려면... 여기를 클릭하세요

Silverlight Toolkit 2008년 12월 버전 릴리즈

2008년 12월 버전 Silverlight Toolkit가 릴리즈 되었습니다.

Silverlight Toolkit December 2008 Download


새로 추가된 컨트롤

  • HeaderedContentControl
  • HeaderedItemsControl

  • Sample Demo Site : 보러가기

    테마

    Sample Demo Site  : 보러기기

    Visual Studio 2010 and .NET Framework 4.0 Training Kit - November Preview

    .Net 4.0을 공부할 수 있는 트레이닝킷이 얼마전에 공개되어 소개합니다.  

    사용자 삽입 이미지


    지난번에 VS20010 CTP 버전이 공개와 더블어 실제로 학습에 도움이 될만한 자료가 나온것 같습니다. C# 4.0과  .Net 4.0에 대한 전반적인 것을 학습할 수 있도록 소스코드와 도움말이 같이 다운로드 받을 수 있게 구성되어 있습니다.

    주요항목은
    • Visual Studio 2010: Office Programmability
    • Visual Studio 2010: Test Driven Development
    • Parallel Extensions: Building Multicore Applications with .NET
    • Introduction To Managed Extensibility Framework
    • ASP.NET AJAX
    • ASP.NET Dynamic Data
    • Intro To Project "Velocity"
    • Intro To F#

    Visual Studio 2010 and .NET Framework 4.0 Training Kit - November Preview : 다운로드

    Silverlight Tools(RC1) 한국어버전 출시

    사용자 삽입 이미지

    11월 24일 월요일자로 버전업이 되었습니다. 다운로드 : Silverlight_Tools.exe

    영문버전버도 약 한달 늦게 나왔습니다. 자세한 내용은 철수네 소프트웨어세상 블로그를 참고하시면 됩니다. 변경된 내용은 다음과 같습니다.

    • Visual Basic 및 C# 프로젝트 템플릿
    • XAML용 Intellisense 및 코드 생성기
    • XAML 디자인 미리 보기
    • Silverlight 응용 프로그램의 디버깅
    • Mac용 Silverlight 응용 프로그램의 원격 디버깅
    • 웹 참조 지원
    • WCF 템플릿
    • 팀 빌드 및 명령줄 빌드 지원
    • Expression Blend와 통합

    가장 크게 좋아진것은 무엇보다도 Silverlight 2 SDK 도움말이 바로 한국어로 출시되었다는 것입니다.
    다운로드 하러 가기

    덧) RC1의 버전은 언제 바뀔까요.. 이젠 버전만 바뀌면 될것 같습니다.

    SQL 2008 설치전 몇가지 고려사항

    얼마전 PC에 SQL 2008을 설치하다가 몇가지 사전작업이 선행되어야 한다는 것을 발견하고 몇글자 적을까 합니다.

    SQL 2005 + Visual Studio 2008(이하 VS2008) 조합으로 개발환경을 구성할때는 SQL 2005를 먼저깔고 VS2008을 나중에 설치하였습니다. VS2008을 먼저 깔경우 SQL2005의 설치유무를 묻기때문입니다. SQL2008 + VS2008 조합도 이전경우와 동일하게 설치하면 되겠거니 생각했지만, SQL2008을 먼저 설치하게 되면 .Net Framework 3.5windows installer 4.5 의 설치유무를 물어서 2가지를 먼저 인스톨 후 SQL2008을 설차해야 합니다.

    저와 같은 이유로 이에 대해서 블로깅한 글이 있습니다. 저도 2~3번 SQL 2008을 설치하다가 방법을 찾아봤습니다. 아주 간단한데요 VS2008을 먼저 설치하고 SQL2008을 설치하면 바로 해결됩니다. 이유는 .Net Framework 3.5windows installer 4.5 는 VS2008 설치옵션에 모두 포함이 되어 있어서 VS2008을 설치하고 SQL2008을 설치하게 되면 이미 VS2008에서 실치했으므로 간단하게 설치체크하고 다음 설치단계로 넘어갑니다.

    그다음 문제는 SQL2008을 설치하기 전 환경설정 체크를 하는데요. 바로 방화벽 문제입니다. 저는 이경우 방화벽을 해제하고 설치를 했습니다. 그러나 매번 설치할때마다 방화벽을 해제하는게 여간 번거로운 작업이 아닙니다. 또 설제 운영되는 서버라면 방화벽을 해제하게 되면 큰 문제가 발생될 수도 있어 방화벽을 해제하지 않고 SQL2008을 설치할 수 있는 방법을 찾아야 하는데, 근본적으로 방화벽의 해제유무를 묻는 이유는 Windows PowerShell을 설치하지 않았기 때문에 문제가 발생하는데 원인이 있습니다. 해결방법은 설치된 운영체제 환경에 따라 다운로드하여 설치하면 해결됩니다.

    Windows XP : 다운로드, Windows Vista : 다운로드

    Microsoft .Net의 새로운 로고입니다.

    사용자 삽입 이미지


    사용자 삽입 이미지



    닷넷의 새로운 로그입니다. 닷넷이 세상에 발표된지도 어느덧 만 8년이 되었습니다. 앞으로 닷넷의 새로운 변화에 관심을 갖어야 할 것 같습니다. 미국 LA에서 열리는 PDC 2008에서 마이크로소프트와 닷넷의 미래에 대한 방향을 제시될 것이며 가까운 미래의 컴퓨팅 환경도 예상해 볼 수 있을 것 같습니다. 지난 8년간 닷넷이 보여준 이전까지의 변화, 그리고 현재와 미래에 대한 발전 방향은 개발자라면 그 변화에 대한 흐름을 절대 놓쳐서는 안될 것으로 여겨집니다.

    2008 PDC에서 Silverlight Tools 및 Toolkit release & Themes 가 발표되었습니다.

    새벽부터 PDC 2008에 관한 기사와 블로그 글들이 쏟아지고 있습니다. 아!! 이제 또 정신 못차리게 되겠구나, 바빠지겠구나 라는 생각이 듭니다. ^^

    Microsoft® Silverlight™ Tools for Visual Studio 2008 SP1 정식 버전이 최종 릴리즈 되었습니다. 다운로드는 여기에서 받으세요, 영문판만 발표된 것 같은데 각 언어권별로 같이 릴리즈 되었네요, 그런데 한글판은 아직 출시안된 것 같습니다. 한글판은 좀 기달려야 할 것 같습니다. (철수네 소프트웨어 세상 블로그를 참고하세요)

    또. Toolkit release & Themes도 같이 발표되었습니다. 기존 WPF와 ASP.NET AJAX에 있었던 좋은 컨트롤들이 포함되어 발표되었습니다.

    사용자 삽입 이미지


    발표된 Toolkit 안에 포함된 컨트롤입니다.

    • AutoCompleteBox
    • Chart
    • DockPanel
    • Label
    • Expander
    • TreeView
    • UpDown
    • ViewBox
    • WrapPanel
    • ImplicitStyleManager


    이와관련해서 공도님이 정성스럽게 정리를 해주셨습니다. 또 Jesse Liberty의 블로그에 소스코드까지 첨부되어서
    자세히 분석되어져 있습니다.

    실버라이트도 개발툴과 런타임이 최종적으로 정식 릴리즈 되었으니 시장에서 플래시와의 대대적인 한판싸움은 피할 수 없게 된 것 같습니다. 뭐 서로 상생해 가면서 발전할 수 있다면 더욱 좋은 것이겠지요. 실버라이트의 시장에서의 파급효과가 얼마나 커질지 앞으로가 주목됩니다.

    Silverlight 2 Controls Review 강좌목록

    그동안 써왔던 Silverlight 2 Controls Review 강좌목록을 정리했습니다.

    Silverlight 2 Controls Reivew - TextBox, Button, TextBlack
    Silverlight 2 Controls Review - DataPicker, Calendar
    Silverlight 2 Controls Review - CheckBox, RadioButton
    Silverlight 2 Controls Review - ComboBox
    Silverlight 2 Controls Review - ListBox
    Silverlight 2 Controls Review - MediaElement
    Silverlight 2 Controls Review - Slider
    Silverlight 2 Controls Review - ToggleButton
    Silverlight 2 Controls Review - HyperlinkButton
    Silverlight 2 Controls Review - Border

    Silverlight 2 Controls Review - Canvas
    Silverlight 2 Controls Review - StackPanel
    Silverlight 2 Controls Review - Grid 1
    Silverlight 2 Controls Review - Grid 2
    Silverlight 2 Controls Review - GridSplitter
    Silverlight 2 Controls Review - TabControl
    Silverlight 2 Controls Review - ProgressBar



    Silverlight 2 컨트롤의 주요 프로퍼티 사용법 및 이벤트를 중심으로 간단한 소스코드를 첨부하여 강좌를 적성하였습니다. 이후 작성될 컨트롤 강좌는 목록에 계속 추가해 나가도록 하겠습니다.

    Silverlight 2 Controls Review - ProgressBar

    ProgressBar 컨트롤은 현재 프로그램의 로드되는 상태를 나타내며, 그림이나 동영상같은 멀티미디어 파일을 다운로드 또는 업로드 하는 현재 상태를 퍼센트로 보여줄 수 있습니다.

    아래 예제는 동영상을 다운로드 하면서 진행상태를 보여주고 동영상을 재생을 재생을 합니다.

    사용자 삽입 이미지


    MediaElement, TextBlack, ProgressBar 컨트롤을 Xaml 코드뷰에서 추가해주거나 Blend에서 추가해줍니다. MediaElement는 다운로드한 동영상을 재생하고 TextBlack는 다운로드 되는 상태를 퍼센트로 보여줍니다.

    Xaml

    <UserControl x:Class="ControlTest17.Page"

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

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

        Width="290" Height="260">

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

           <ProgressBar Margin="32,0,105,31" x:Name="pgsLoad" Minimum="0"

                        VerticalAlignment="Bottom" Height="19"/>

           <TextBlock Height="19" HorizontalAlignment="Right" Margin="0,0,-8,31"

                      VerticalAlignment="Bottom" Width="97" Text="TextBlock"

                      TextWrapping="Wrap" x:Name="tbResult"/>

           <MediaElement Margin="30,20.5,25,66.5" x:Name="mediaElement" AutoPlay="True"/>

        </Grid>

    </UserControl>


    C# Code

    using System;

    using System.Net;

    using System.Windows.Controls;

     

    namespace ControlTest17

    {

        public partial class Page : UserControl

        {

            public Page()

            {

                InitializeComponent();

     

                WebClient webclient = new WebClient();

     

                webclient.OpenReadAsync(new Uri("Silverlight.wmv",

    UriKind.RelativeOrAbsolute));

                webclient.DownloadProgressChanged += new

                    DownloadProgressChangedEventHandler(webclient_DownloadProgressChanged);

                webclient.OpenReadCompleted +=

                    new OpenReadCompletedEventHandler(webclient_OpenReadCompleted);

            }

     

            void webclient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)

            {

                if (e.Error == null)

                {

                    try

                    {

                        mediaElement.SetSource(e.Result);

                        mediaElement.Play();

                    }

                    catch (Exception ex) {}

                }

            }

     

            void webclient_DownloadProgressChanged(object sender,

                DownloadProgressChangedEventArgs e)

            {

                pgsLoad.Value = e.ProgressPercentage;

                tbResult.Text = e.ProgressPercentage.ToString() + "% Completed";

            }

        }

    }


    WebClient 클래스를 이용하여 웹에서 동영상 경로를 설정하고 DownloadProgressChanged 메소드는 다운로드 되고 있는 상태를 PregressBar, TextBlack에 다운로드 되고 있는 결과를 보여줍니다.  ebclient_OpenReadCompleted 이벤트는 조건문을 통하여 다운로드 중 에러가 발생했는지 체크를 하고 에러가 없으면 결과값을 보여줍니다.



    Silverlight 2 Controls Review - TabControl

    TabControl은 여러 페이지 사이를 빠르게 전환하는데 유용한 컨트롤입니다. 기본적인 사용법은 아래 Xaml 코드와 같습니다.

    <basics:TabControl Margin="50,50,55,0" UseLayoutRounding="True" Height="152" TabStripPlacement="Top" SelectedIndex="1"

                                VerticalAlignment="Top">

    <basics:TabItem Header="Tab 1"><TextBlock  Text="텝의 기초 1" /></basics:TabItem>

    <basics:TabItem Header="Tab 2"> <TextBlock  Text="텝의 기초 2" /></basics:TabItem>

    <basics:TabItem Header="Tab 3"><TextBlock  Text="텝의 기초 3" /></basics:TabItem>

    <basics:TabItem Header="Tab 4"><TextBlock  Text="텝의 기초 4" /></basics:TabItem>

    </basics:TabControl>



    기본적인 TabControl을 생성했을때 보여지는 결과입니다. 4개의 TabItem이 들어가 있습니다.


    사용자 삽입 이미지


    TabControl 안에는 독립적으로 TabItem 컨트롤이 존재하며 TabItem 안에는 Button이나 TextBox 같은 Input 관련 컨트롤이나 레이아웃을 구성할 수 있는 StackPanel, Canvas 같은 페널을 추가할 수 있습니다. 아래코드는 TabItem에 Button 컨트롤을 삽입한 것입니다.

    <basics:TabItem Header="Tab 1" >

    <Button x:Name="btnTab1" Content="Click Me" Width="60" Height="25"/>

    </basics:TabItem>




    TabItem에 Button 컨트롤이 추가된 모습입니다.
    사용자 삽입 이미지

    Grid 패널을 이용하여 여러가지 컨트롤을 배치 할 수 있습니다.

    <basics:TabItem Header="Tab 1" >

    <Button x:Name="btnTab1" Content="Click Me" Width="60" Height="25"/>

    </basics:TabItem>




    여러가지 컨트롤을 배치한 모습입니다.
    사용자 삽입 이미지
     

    Tab의 타이틀에 이미지(또는 아이콘)를 집어넣을 수 있습니다. StackPanel 컨트롤을 추가하고 자식 엘리먼트로 이미지 컨트롤을 이용해 Source 프로퍼티에 이미지경로를 지정합니다.

    <basics:TabItem Width="100">

    <basics:TabItem.Header>

            <StackPanel Orientation="Horizontal">

                <Image Source="tab_isleaf.png" />

                <TextBlock Text="Tab 3" Margin="2,0,0,0"/>

            </StackPanel>

        </basics:TabItem.Header>

    </basics:TabItem>

    텝의 타이틀에 이미지를 추가한 모습입니다.

    사용자 삽입 이미지

    텝의 타이틀에 이미지 추가하는 것처럼 컨텐츠에 이미지를 추가할 수 있습니다. 이미지 컨트롤의 Source 프로퍼티에 인터넷에 있는 그림의 경로를 지정할 수 있습니다.

    <basics:TabItem Header="Tab 4">

    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">

        <Image Source="http://fs.textcube.com/blog/0/2349/attach/XV3tNbRAgR.png"
    Height
    ="150" Width="80"/>

    </StackPanel>

    </basics:TabItem>

    웹의 경로를 지정하여 이미지를 출력한 모습입니다.

    사용자 삽입 이미지

    Xaml Code

    <basics:TabControl Margin="50,50,55,0" UseLayoutRounding="True"  TabStripPlacement="Top" SelectedIndex="1"

                                VerticalAlignment="Top" Height="152" >

                   <basics:TabItem Header="Tab 1" >

                    <Button x:Name="btnTab1" Content="Click Me" Width="60" Height="25"/>

                </basics:TabItem>

                   <basics:TabItem Header="Tab 2">

                    <Grid>

                        <Grid.RowDefinitions>

                            <RowDefinition Height="25"/>

                            <RowDefinition />

                            <RowDefinition />

                            <RowDefinition />

                        </Grid.RowDefinitions>

                       

                        <Grid.ColumnDefinitions>

                            <ColumnDefinition Width="50"/>

                            <ColumnDefinition Width="*"/>

                        </Grid.ColumnDefinitions>

     

                        <TextBlock x:Name="tbPhone" Text="Phone" Grid.Column="0" Grid.Row="0"/>

                        <TextBlock x:Name="tbName" Text="Name" Grid.Column="0" Grid.Row="1"/>

                        <TextBlock x:Name="tbAddress" Text="Address" Grid.Column="0"
    Grid.Row
    ="2"/>

     

                        <TextBox x:Name="txtPhone" Grid.Column="1" Grid.Row="0"/>

                        <TextBox x:Name="txtName" Grid.Column="1" Grid.Row="1"/>

                        <TextBox x:Name="txtAddress" Grid.Column="1" Grid.Row="2"/>

    <Button x:Name="btnResult" Content="등록" Grid.Row="3"
    Grid.ColumnSpan
    ="2"/>

                    </Grid>

                </basics:TabItem>

                <basics:TabItem Width="100">

                    <basics:TabItem.Header>

                        <StackPanel Orientation="Horizontal">

                            <Image Source="tab_isleaf.png" />

                            <TextBlock Text="Tab 3" Margin="2,0,0,0"/>

                        </StackPanel>

                    </basics:TabItem.Header>

                </basics:TabItem>

                <basics:TabItem Header="Tab 4">

                    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">

                        <Image Source="http://fs.textcube.com/blog/0/2349/attach/XV3tNbRAgR.png"
    Height
    ="150" Width="80"/>

                    </StackPanel>

                </basics:TabItem>

            </basics:TabControl>

            <basics:TabControl Margin="50,0,55,28" UseLayoutRounding="True"  TabStripPlacement="Top"

    SelectedIndex="1" VerticalAlignment="Bottom" Height="127" x:Name="Tab2">

    </basics:TabControl>

    텝의 전환은 텝의 타이틀을 클릭함으로서 가능하고 텝의 위치는 Dock 타입이며 TabStripPlacement 프로퍼티를 이용하면 Top, Bottom, Left, Right 4가지 방향으로 배치 할 수 있습니다. 또 텝을 삭제하고 추가할 수 있습니다.

    다음 코드는 텝을 사방으로 전환하고, 추가, 삭제할 수 있는 예제입니다.

    사용자 삽입 이미지


    사용자 삽입 이미지

    사용자 삽입 이미지


    사용자 삽입 이미지


    Xaml Code

    <basics:TabControl Margin="50,0,55,28" UseLayoutRounding="True"  TabStripPlacement="Top"

            SelectedIndex="1" VerticalAlignment="Bottom" Height="127" x:Name="Tab2">

               

            </basics:TabControl>

            <Button Height="26" HorizontalAlignment="Right" Margin="0,0,55,195"

                    VerticalAlignment="Bottom" Width="93" Content="텝 삭제"

                    x:Name="TabItemDel" Click="TabItemDel_Click"/>

           

            <ComboBox VerticalAlignment="Bottom" Height="26" Margin="149,0,157,195" x:Name="cboOrientation" SelectionChanged="ComboBox_SelectionChanged">

                <ComboBoxItem Content="Top"/>

                <ComboBoxItem Content="Bottom"/>

                <ComboBoxItem Content="Left"/>

                <ComboBoxItem Content="Right"/>

            </ComboBox>

           

            <Button Margin="47,0,0,195" Content="텝 추가" Height="26"

                    VerticalAlignment="Bottom" HorizontalAlignment="Left"

                    Width="93" x:Name="TabItemAdd" Click="TabItemAdd_Click"/>


    C# Code

    /// <summary>

    /// TabItem Add

    /// </summary>

    /// <param name="sender"></param>

    /// <param name="e"></param>

    private void TabItemAdd_Click(object sender, RoutedEventArgs e)

    {

    // Tab Create

    TabItem tabitem = new TabItem();

             

    int tcnt = 0;

     

    for (int i = 0; i<Tab2.Items.Count; i++)

    {

    tcnt = tcnt + 1;

    tabitem.Header = "Tab " + tcnt;

    }

     

    Tab2.Items.Add(tabitem);

    }

     

    /// <summary>

    /// TabItem Delete

    /// </summary>

    /// <param name="sender"></param>

    /// <param name="e"></param>

    private void TabItemDel_Click(object sender, RoutedEventArgs e)

    {

    int tabcnt = Tab2.Items.Count;

     

        if (tabcnt > 0)

        {

            Tab2.Items.RemoveAt(tabcnt - 1);

    }

        else

        {

            MessageBox.Show("삭제할 텝이 없습니다.");

            return;

        }

    }

     

    /// <summary>

    /// TabItem Orientation

    /// </summary>

    /// <param name="sender"></param>

    /// <param name="e"></param>

    private void ComboBox_SelectionChanged(object sender,

                SelectionChangedEventArgs e)

    {

    int cboitem = cboOrientation.SelectedIndex;

     

    if (cboitem < 0)

    return;

     

    switch (cboitem)

    {

            case 0:

                Tab2.TabStripPlacement = Dock.Top;

                break;

            case 1:

                Tab2.TabStripPlacement = Dock.Bottom;

                break;

            case 2:

                Tab2.TabStripPlacement = Dock.Left;

                break;

            case 3:

                Tab2.TabStripPlacement = Dock.Right;

                break;

    }

    }


    Silverlight 2 워터마크 컨트롤 (WatorMarked Text Box Control)

    Silverlight 2 beta 1 버전과 Silverlight 2 정식 릴리즈 버전의 지원되는 컨트롤 비교입니다.

    사용자 삽입 이미지


    사용자 삽입 이미지



    2008년 3월에 Silverlight 2 Beta 1이 발표되면서 컨트롤에 들어있던 ScrollBar, ToolTip, WarkmarkedTextBox, ContentControl 컨트롤이 빠지고 beta 2, RC0, Silverlight 2 (RTW) 순으로 정식버전까지 릴리즈되면서 ComboBox, PasswordBox, ProgressBar, TabControl 컨트롤 등이 추가되었고, 정식 컨트롤형태는 아니지만 MessageBox.Show()의 메소드 형태로 MessageBox가 추가되어 공개되었습니다. RC0이후 정식 버전이 출시되었지만 특별히 추가된 컨트롤은 없습니다. 정식릴리즈에서 WarkmarkedTextBox 컨트롤이 빠졌다는게 조금은 실망이였는데 Tim Heuer( http://timheuer.com/blog )블로그에 커스텀 컨트롤로 WatermarkedTextBox 소스 및 dll을 공개하였습니다.


    WaterMarkedTextBox  컨트롤 다운로드

  • Source: WatermarkedTextBox-Source.zip
  • Binary only: WatermarkedTextBox-Binary.zip



    커스텀 컨트롤 테스트

    사용자 삽입 이미지

    WaterMarkedTextBox 컨트롤을 사용하기 위해선 Silverlight 2 프로젝트를 하나 만들고 Microsoft.Windows.Controls.WatermarkedTextBox.dll 파일을 솔루션 탐색기에서 참조에 추가합니다.




    사용자 삽입 이미지




    Xaml 코드에는 아래 소스코드와 같이 추가하면 됩니다.
  • <UserControl x:Class="WatermarkTextBox.Page"

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

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

         xmlns:local="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls.WatermarkedTextBox"

        Width="400" Height="300">

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

            <Grid.RowDefinitions>

                   <RowDefinition Height="0.313*"/>

                   <RowDefinition Height="0.113*"/>

                   <RowDefinition Height="0.117*"/>

                   <RowDefinition Height="0.127*"/>

                   <RowDefinition Height="0.33*"/>

            </Grid.RowDefinitions>

            <local:WatermarkedTextBox x:Name="WmPhoneNumber" Grid.Row="1"

              Watermark="휴대폰 입력" HorizontalAlignment="Center"

              VerticalAlignment="Center" Width="150"/>

            <local:WatermarkedTextBox x:Name="WmName" Grid.Row="2"

              HorizontalAlignment="Center" VerticalAlignment="Center"

              Watermark="이름 입력" Width="150"/>

            <local:WatermarkedTextBox x:Name="WmAddress"

              Watermark="주소 입력" Grid.Row="3" Width="150"

              HorizontalAlignment="Center" VerticalAlignment="Center" />

        </Grid>

    </UserControl>


  • Silverlight 2 Controls Review - GridSplitter

    그리드는 키보드 혹은 마우스등을 이용하여 행과 열의 크기를 자유자재로 조절할 수 있다는 큰 특징이 있습니다. 이것을 가능케하는 컨트롤이 바로 GridSplitter(그리드스플리터) 컨트롤입니다.

    GridSplitter는 HorizontalAlignment의 기본 값은 Right이고 VerticalAligument의 기본 값은 Stretch이기 때문에, 기본적으로 특정한 셀의 오른쪽에 도킹됩니다. GridSplitter의 올바른 사용은 적어도 한방향으로 Strect 정렬을 하는 것입니다.

    GridSplitter를 마우스를 좌우 또는 위아래로 드래그(drag)하게 되면 드래그한 GridSplitter의 주변의 Grid 및 셀안의 자식 엘리먼트 크기는 자동 조절됩니다.

    그리드(Grid)의 열(Column)을 지정합니다. <ColumnDefinition Width="5"/>는(은) GridSplitter가 위치할 셀입니다.

    <!--Grid Column-->

    <Grid.ColumnDefinitions>

         <ColumnDefinition Width="80" />

         <ColumnDefinition Width="5"/>

         <ColumnDefinition Width="80" />

         <ColumnDefinition Width="5"/>

         <ColumnDefinition Width="80" />

         <ColumnDefinition Width="5"/>

         <ColumnDefinition Width="80" />

    </Grid.ColumnDefinitions>


    그리드(Grid)의 행(Row)을 지정합니다. <RowDefinition Height="5" />는(은) GridSplitter가 위치할 셀입니다.

    <!--Grid Row-->

    <Grid.RowDefinitions>

         <RowDefinition Height="80" />

         <RowDefinition Height="5" />

         <RowDefinition Height="80" />

         <RowDefinition Height="5" />

         <RowDefinition Height="80" />

         <RowDefinition Height="5" />

         <RowDefinition Height="80" />

    </Grid.RowDefinitions>


    그리드의 자식 엘리먼트 입니다

    <!--자식 엘리먼트-->

    <Rectangle Grid.Row="0" Grid.Column="0" Fill="Red"/>

    <Rectangle Grid.Row="2" Grid.Column="0" Fill="Green"/>

    <Rectangle Grid.Row="4" Grid.Column="0" Fill="Blue"/>

    <Rectangle Grid.Row="6" Grid.Column="0" Fill="Yellow"/>

    <Rectangle Grid.Row="0" Grid.Column="2" Fill="Green"/>

    <Rectangle Grid.Row="2" Grid.Column="2" Fill="Blue"/>

    <Rectangle Grid.Row="4" Grid.Column="2" Fill="Yellow"/>

    <Rectangle Grid.Row="6" Grid.Column="2" Fill="Red"/>

    <Rectangle Grid.Row="0" Grid.Column="4" Fill="Blue"/>

    <Rectangle Grid.Row="2" Grid.Column="4" Fill="Yellow"/>

    <Rectangle Grid.Row="4" Grid.Column="4" Fill="Red"/>

    <Rectangle Grid.Row="6" Grid.Column="4" Fill="Green"/>

    <Rectangle Grid.Row="0" Grid.Column="6" Fill="Yellow"/>

    <Rectangle Grid.Row="2" Grid.Column="6" Fill="Red"/>

    <Rectangle Grid.Row="4" Grid.Column="6" Fill="Green"/>

    <Rectangle Grid.Row="6" Grid.Column="6" Fill="Blue"/>

           

    사용자 삽입 이미지


    GridSplitter 입니다. GridSplitter 역시 Grid의 자식엘리먼트로 위치하며 Rectangle의 사이사이에 들어갑니다.  ColumnSpan 프로퍼티는 GridSplitter가 속한 행 또는 열을 합쳐서 하나의 셀로 사용할 수 있도록 하여 GridSplitter를 마우스도 드래그 할때 어느 위치에서든 크기 조절을 가능토록 합니다. ShowsPreview 프로퍼티는 크기를 조절할 때 이웃한 셀과 자식엘리먼트의 크기가 자동으로 조절되면서 변경된 크기를 미리 보여줍니다. HorizontalAlignment와 VerticalAlignment의 프로퍼티 값은 Stretch를 주어 GridSplitter가 들어간 셀크기 만큼 GridSplitter크기를 채우겠다는 뜻입니다.

    <basics:GridSplitter Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="7"

      ShowsPreview="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />

    <basics:GridSplitter Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="7"

      ShowsPreview="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />

    <basics:GridSplitter Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="7"

      ShowsPreview="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>

    <basics:GridSplitter Grid.Row="0" Grid.Column="1" Grid.RowSpan="7"

      ShowsPreview="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />

    <basics:GridSplitter Grid.Row="0" Grid.Column="3" Grid.RowSpan="7"

    ShowsPreview="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />

    <basics:GridSplitter Grid.Row="0" Grid.Column="5" Grid.RowSpan="7"

    ShowsPreview="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />


    사용자 삽입 이미지

    사용자 삽입 이미지

    Xaml

    <UserControl xmlns:basics="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"  x:Class="ControlTest15.Page"

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

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

        Width="340" Height="340">

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

            <!--Grid Column-->

            <Grid.ColumnDefinitions>

                <ColumnDefinition Width="80" />

                <ColumnDefinition Width="5"/>

                <ColumnDefinition Width="80" />

                <ColumnDefinition Width="5"/>

                <ColumnDefinition Width="80" />

                <ColumnDefinition Width="5"/>

                <ColumnDefinition Width="80" />

            </Grid.ColumnDefinitions>

           

            <!--Grid Row-->

            <Grid.RowDefinitions>

                <RowDefinition Height="80" />

                <RowDefinition Height="5" />

                <RowDefinition Height="80" />

                <RowDefinition Height="5" />

                <RowDefinition Height="80" />

                <RowDefinition Height="5" />

                <RowDefinition Height="80" />

            </Grid.RowDefinitions>

     

            <!--자식 엘리먼트-->

            <Rectangle Grid.Row="0" Grid.Column="0" Fill="Red"/>

            <Rectangle Grid.Row="2" Grid.Column="0" Fill="Green"/>

            <Rectangle Grid.Row="4" Grid.Column="0" Fill="Blue"/>

            <Rectangle Grid.Row="6" Grid.Column="0" Fill="Yellow"/>

            <Rectangle Grid.Row="0" Grid.Column="2" Fill="Green"/>

            <Rectangle Grid.Row="2" Grid.Column="2" Fill="Blue"/>

            <Rectangle Grid.Row="4" Grid.Column="2" Fill="Yellow"/>

            <Rectangle Grid.Row="6" Grid.Column="2" Fill="Red"/>

            <Rectangle Grid.Row="0" Grid.Column="4" Fill="Blue"/>

            <Rectangle Grid.Row="2" Grid.Column="4" Fill="Yellow"/>

            <Rectangle Grid.Row="4" Grid.Column="4" Fill="Red"/>

            <Rectangle Grid.Row="6" Grid.Column="4" Fill="Green"/>

            <Rectangle Grid.Row="0" Grid.Column="6" Fill="Yellow"/>

            <Rectangle Grid.Row="2" Grid.Column="6" Fill="Red"/>

            <Rectangle Grid.Row="4" Grid.Column="6" Fill="Green"/>

            <Rectangle Grid.Row="6" Grid.Column="6" Fill="Blue"/>

           

            <basics:GridSplitter Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="7"

               ShowsPreview="True" HorizontalAlignment="Stretch"

               VerticalAlignment="Stretch" />

            <basics:GridSplitter Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="7"

               ShowsPreview="True" HorizontalAlignment="Stretch"

               VerticalAlignment="Stretch" />

            <basics:GridSplitter Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="7"

               ShowsPreview="True" HorizontalAlignment="Stretch"

               VerticalAlignment="Stretch"/>

            <basics:GridSplitter Grid.Row="0" Grid.Column="1" Grid.RowSpan="7"

               ShowsPreview="True" HorizontalAlignment="Stretch"

               VerticalAlignment="Stretch" />

            <basics:GridSplitter Grid.Row="0" Grid.Column="3" Grid.RowSpan="7"

               ShowsPreview="True" HorizontalAlignment="Stretch"

               VerticalAlignment="Stretch" />

            <basics:GridSplitter Grid.Row="0" Grid.Column="5" Grid.RowSpan="7"

               ShowsPreview="True" HorizontalAlignment="Stretch"

               VerticalAlignment="Stretch" />

        </Grid>

    </UserControl>