퇴근5분전


 KeyboardNavigation.TabNavigation="Cycle"

페이지 내의 포커스가 마지막엘리먼트 이후 외부로 또는 어딘지 모르는곳으로 튀는것을 막기위해
처음엔 FocusManager.FocusedElement="{Binding ElementName=포커스지정엘리먼트명}"
으로 작성하여 잘 되는것처럼 보였으나...

탭컨트롤 안으로 들어가서 계층구조의 깊이가 깊어질수록 난해하고 복잡함에 지정된대로 적용도 안되고 하여
MSDN을 다시 읽어보던 중 키보드네비게이션을 발견!!

아쒸~~ 꼬박 하루 삽질해서 찾은거네.. ㅋㅋ  어쨌든..
참조 : http://msdn.microsoft.com/ko-kr/library/aa969768(VS.90).aspx#Keyboard_Focus 

열심히 바꿔야겠군...

2015-09-05

     첨부파일을 추가했음 ( 내부 ) : 사용자정의용컨트롤에 대한 처리.

'# 3) .Net ( Vs 2008 ) > WPF' 카테고리의 다른 글

IValueConverter 사용 데모  (0) 2010.09.06
WPF 쓰레드 ( 프로그래스바 )  (0) 2010.08.10
툴을 제작 해서 프로젝트를... 진행하다!  (0) 2010.02.26
WPF 3D  (0) 2009.12.29
데이타바인딩(2)  (0) 2009.12.28


더블값 부호 후행 처리를 위해...

  string ss = "5000.00-";
            double d =  double.Parse(ss, System.Globalization.NumberStyles.AllowTrailingSign | System.Globalization.NumberStyles.Float);

SAP에서는 -가 뒤에 붙어오는데 이를 바꾸기 위해 위처럼. NumberStyles 값을 or해주면 된다.

어쨌든...  굵은 글씨를...

훈스에 김시원님이 강좌에 개나소나...로 써주셨던.. 난 몰랐던... ㅠㅠ;

찾아보니..  아래처럼 되는것? 같은... 글이었음.


 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
          

            SomeType st = 0;
            int i = st;

        }
    }

    class SomeType
    {
        object _obj = 0;

        public object Value
        {
            get { return _obj; }
          private  set { _obj = value; }
        }

        public SomeType(object obj)
        {
            _obj = obj;
        }

        public static implicit operator SomeType(int typ)
        {
            try
            {
                 return new SomeType(typ);
            }
            catch(Exception ex ) {
                throw ex;
            }

        }

        public static implicit operator int(SomeType typ)
        {
            try
            {
                checked
                {
                    return (int)typ.Value;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }

'# 3) .Net ( Vs 2008 ) > C#' 카테고리의 다른 글

LINQ 그룹바이... 훌...  (0) 2010.07.30
Double.Parser()...  (0) 2010.07.19
IPC .Net ( 프로세스간 통신 )  (1) 2010.05.12
VB의 Left구현하기... 확장메서드를 이용함...  (0) 2010.02.22
기간 출력하고자 할때...  (0) 2010.02.18


참조 http://msdn.microsoft.com/ko-kr/library/system.runtime.remoting.channels.ipc(VS.90).aspx 

훈스 게시판에 몇일전부터 [프로스세간 통신(IPC)] 과 관련하여 질문이 올라오고 있었는데...

찾아보니 위 참조 링크처럼 심플한게 있다.

구현해본결과 오!! 이런게 되는구나...


서버와 클라이언트... 예제를 실행한 결과 이미지이다.

클라이언트에서 객체 요청이 있을때마다 서버에서는 원격객체에 값을 + 1 해서 전달해준다.

예제는 서버, 클라이언트, 원격객체 세 프로젝트로 구성된다.

 * 원격객체를 서버, 클라이언트에 각각 참조시켜야 한다.  
  서버에서 정의 하고 클라이언트에서 정의를 또하고 해봤는데 에러가 뜬다 공개토큰이 null이 어쩌고 저쩌고... 삽질..

예제를 올려놓는다.


VB.NET을 계속 수정하다 보니 지루하고 짜증만 나고 익숙하지 않은 노트북 키보드에... 여러가지 힘든점을

늘 그렇듯... 이번에도 툴을 만들었다.

훨씬 객체간에 데이타 주고 받는 느낌은 심플하다..

그리드 컬럼으로 부터 -> 출발해서...

완성되는 소스에 조각 조각 코드를 생성해서 붙여넣는다..


          >> 우측 하단에 뜨는 메인폼임. ( 트레이 가능 )


>> 왼쪽 코드를 붙여넣으면 정규식에 의해 변수만 체크해서 리스트화 한다.


>> 리스트화된 변수에 대한 셋팅을 한다. 이는 그리드 셋팅 문구를 만들어내는데 필요한 설정내역이다.


 >> 만들어낸 결과물이다... 이를 복사해서 붙여넣으면 된다.



>> 그리드의 컬러 셋팅구문을 만들내는 화면이다. 그리드 컬럼을 선택하고 만들어내서 붙여넣기 하면 된다.


>> 그리드내에서 코드들을 찾는 폼을 띠울때 설정하는 몇가지 이벤트 코드를 한꺼번에 뽑아낼수 있는 화면이다.
 일일이 치는게 만만한 일이 아니어서...


>> 폼 상단에 추가되는 버튼들의 이벤트와 생성을 뽑아내는 화면이다.. 등록하고 뽑아내면 쉽게 만들어낸다.


>> J 라는 빨간 아이콘은 해당 프로그램이 트레이에 들어가있을때의 아이콘임... ( 캬~~ )





이로써 일주일간 테스트 해본결과... 작업이 굉장히 빠른데... 겁나게 피곤하다..

그래도.. 일일이 타이핑하기에 너무 많은 양이라... 이렇게 하지 않음... 못버티겠다...

또 하나의 툴을 만들어내고 업글하는 재미로.. 지금 프로젝트는 진행 되고 있다.

'# 3) .Net ( Vs 2008 ) > WPF' 카테고리의 다른 글

WPF 쓰레드 ( 프로그래스바 )  (0) 2010.08.10
[WPF] Tab 순환코드  (0) 2010.07.27
WPF 3D  (0) 2009.12.29
데이타바인딩(2)  (0) 2009.12.28
데이타바인딩(1)  (0) 2009.12.28

 
간단해서.. 그닥.. 기록할내용은 없는듯...


사용법 : 
   this.Text = "ABCCC".Left(2);

확장메서드 구현 : 
 

 /// <summary>
    /// VB.Left() 함수를 구현한 확장메서드임.
    /// </summary>
    internal static class exString
    {
        /// <summary>
        ///  VB.Left() 함수를 구현한 확장메서드임.
        /// </summary>
        /// <param name="targetstr"></param>
        /// <param name="length">왼쪽에서~~ </param>
        /// <returns></returns>
        internal static string Left(this string targetstr, int length)
        {
            if (length < 0) // -1이 들어왔을때...
                throw new Exception("'Length' 인수는 0보다 크거나 같아야 합니다.");

            if (targetstr.Length > length )
            {
                return targetstr.Substring(0, length);
            }
            else
            {
                return targetstr;
            }
        }

        /// <summary>
        /// VB.Right() 함수를 구현한 확장메서드
        /// </summary>
        /// <param name="targetstr"></param>
        /// <param name="length"></param>
        /// <returns></returns>
        internal static string Right(this string targetstr, int length)
        {
            if (length < 0)
            {
                throw new Exception("'Length' 인수는 0보다 크거나 같아야 합니다.");
            }

            if (targetstr.Length > length)
            {
                return targetstr.Substring(targetstr.Length - length, length);
            }
            else
            {
                return targetstr;
            }
        }
    }


2010, 2, 25 일 Right 추가..

훈스 C#게시판에 올라온 글에 대한 답변을 찾아보던 중,..

VB에 Format(일수, "mm" )  이란 함수를 호출하면 일자에 맞는 기간을 출력해준다고 한다
예)
     399  를 넣으면  "1년 1개월 3일" 이 나온다고 한다.

머리를 조낸 굴려봐도 지원되는 객체는 안보인다..

기간에 해당하는것 하면 TimeSpan이 바로 떠오르는데...

TimeSpan에서 출력해주는 건 전혀 없다.

아래와 같이 직접 구해야 하는듯 하다.


TimeSpan.Zero ~ TimeSpan.FormDays( 일수 ) 만큼에 Tick값으로

DateTime을 생성하면  DateTime의 초기값 1년 1월 1일 ~ 계산되어 만들어진다.

DateTimeOffset객체에서 ToOffSet(  TimeSpan  ); 메서드를 이용해볼까 했었는데...

이거자체가 DateTime때문에 에러가 뜨게 되므로...
직접 포멧을 지정해야한다. 

          double day = 399;
          DateTimeOffset off = new DateTime(TimeSpan.FromDays( day ).Ticks );
          MessageBox.Show(string.Format("{0}년 {1}개월 {2}일", off.Year - 1, off.Month - 1, off.Day - 1));

DateTimeOffset 은 그냥 ... 알게된 객체이므로... 써본다.
http://msdn.microsoft.com/ko-kr/library/system.datetimeoffset_members.aspx



추가적으로 WPF 게시판에 올라왔던 답변을 좀 허접하게 달았던 내용을
다음과 같이 처리한다.

질문내용은 두날짜간에 개월수 차이를 구하여 컬럼으로 표시하고자 하는 부분이었으나

처음 단 답글은 년차를 월에 포함하지 못하는 상황과 약간에 판단착오가 있었다.
이에 대해.. 위 기간 구하는것을 참고하여 아래와 같이 바꾸고 그 답변에 대해 알림형태로 게시판에 남겼다.

            DateTime dt = new DateTime(2001, 2, 1);
            DateTime dt2 = new DateTime( Math.Abs( ( new DateTime(2002, 2, 27).Subtract( dt ).Ticks ) ) );
            MessageBox.Show((      ((dt2.Year-1) * 12) + ( dt2.Month )     ).ToString());


훈스닷넷에서 NotifyIcon 활성화 하고.

마우스 왼쪽, 오른쪽 버튼을 각각 다른 메뉴를 주고 싶다고 하신분께 올린 답글임.

몇가지 방법을 찾아봤는데 애매 했었으나...

ContextMenuStrip.Show   에서 해결책이 하나 있고.

여기에 부합되게 MousePosition 이란 값을 이용할수 있었다.

NotifyIcon 의 mouseEvt 에  이벤트 매개변수를 이용해봤지만 원하는곳에 Show가 안된다!

그래서 MousePosition 을 이용해서 마우스 위치값을 사용함. 아주 잘된다!









초보시라니 초간단.... 방법을 소개 해드리죵...
 
구성은 Form 1개
 
NotifyIcon 1개
 
ContextMenuStrip 2개 (Left용, Right용 )
 
주의 NotifyIcon에 ContextMenuStrip 속성에는 바인딩 하지 않습니다.
 
 
 
아래소스 대로 돌려보세용... 원하시는데로~~ 될꺼임돵.
 
 
 
 
 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load += new EventHandler(Form1_Load);
            this.Shown += new EventHandler(Form1_Shown);
        }
        void Form1_Shown(object sender, EventArgs e)
        {
            this.Hide();
        }
        void Form1_Load(object sender, EventArgs e)
        {
       //this.notifyIcon1.ContextMenuStrip = contextMenuStrip1; 바인딩하지 않는다!
            this.notifyIcon1.MouseDown += new MouseEventHandler(contextMenuStrip1_MouseDown);
        }
        void contextMenuStrip1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                contextMenuStrip1.Show( MousePosition );
            }
            else if( e.Button == MouseButtons.Right)
            {
                contextMenuStrip2.Show(MousePosition);
            }
        }
        private void leftMouseDownToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Left Click");
        }
        private void rightMouseToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("RightClick");
        }
    }


훈스 C# 게시판에 올라온 질문에 대한 답글로 잠깐 만들어서 답글을 했던 내용임.

ComboBox에 바인딩하고 이값에 대한 값을 처리할때 단위데이타를 만들고 이에 대한 집합을 만들어
콤보 박스에 바인딩해주면 나중에 단위데이타가 여럿 일 경우 해당 단위데이타 상태까지도 컨트롤 가능해짐 .

예제에는 ComboBox 1개, TextBox 1개
             ComboBox.SelectedIndexChanged 이벤트

소스 ~~~


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            ComboList clist = new ComboList();
            clist.Add("A", "1");
            clist.Add("B", "2");
            clist.Add("C", "3");
            clist.Add("D", "4");

            comboBox1.DataSource = clist;              // IListSource를 요구함.
            comboBox1.DisplayMember = "Name";
            comboBox1.ValueMember = "Value";
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.textBox1.Text = ((_ComboItem)comboBox1.SelectedItem).Value;
           // 바인딩 된 Item을 가지고 처리 하므로 단위 아이템의 프로퍼티 갯수는 증감할 수 있음.
        }
    }


    public class _ComboItem  // 단위 아이템
    {
       public string Name { get; set; }
       public string Value { get; set; }

       public override string ToString()
       {
           return Name; // combobox에 디스플레이 됨.
       }
    }

    public class ComboList : IListSource  // 집합아이템
    {
        List<_ComboItem> items = new List<_ComboItem>();

        public void Add(string _Name, string _Value)
        {
            items.Add(new _ComboItem() { Name = _Name, Value = _Value });
            // 2005에서는 _ComboItem에 생성자로 파라미터를 받으면 됨.
        }

        public string this[string Name] 
// 인덱서를 이용하여 단위데이타에 대한 추적이 객체명[ 단위데이타이름 ]으로 가능.
        {
            get {
                string returnValue = string.Empty;

                foreach (_ComboItem item in items)
                {
                    if (item.Name == Name)
                    {
                        returnValue = item.Value;
                        break;
                    }
                }

                return returnValue;
           
            }
        }

        #region IListSource 멤버

        public bool ContainsListCollection
        {
            get { return true; }
        }

        public System.Collections.IList GetList()
        {
            return items;
        }

        #endregion
    }

}

// 여기서 빠진거라면 단위데이타를 제거하는 Dispose와 Clear 기능임.  빠진다고 해서 그닥.. 큰 영향은 없는듯도 하고..
// 많아 진다면... 구현해주는게 좀더 나을것 같다.



 

WPF 3D

# 3) .Net ( Vs 2008 )/WPF2009. 12. 29. 01:09
 프로그래밍을 하면서 3D.. 언젠가 해보고 싶었다!

.Net 2.0을 할때도 다이렉트X 지원없이 순수 수학적개념을 바탕으로 구현해보고자 해서 별짓 다해봤다.
행렬계산도 마다않고 API를 만들었던 기억이 난다.
 끝내 완성은 못했지만 ㅠㅠ;..  소스를 얻었다 어디선가 3D를 구현해둔게 있었다..

 다이렉트X에서 말하는 파이프라인을 직접 GDI+ 를 이용한 소스를 손에 넣고 돌려보고 감탄하고
접어버렸다.

 다시 접하게 된 WPF 3D...
우선 책에 있는 소스 그대로 쳐봤다. 멋지군...

사용자 삽입 이미지

해보려고 했더니 그닥...특별한게 없넹...

<ViewPort3D>요소 안에 3D를 구현하게 되는데

필요한 요소에 대한 설명이 있음.
 1. GeometryModel3D 형식에 객체,
 2. 빛과 관련된 광원객체
 3. 카메라 그리고 관찰자

참 말은 다르지만 낯익은 단어들...

- 3D구성요소
 Models    
 Meterials
 Camera
 Light

매쉬( Mesh ) : 3D 객체는 삼각형의 조합을 통해 구성된다. 이렇게 삼각형 조합을 통해 구성된 3D모델
WPF에서는 이러한 모델을 구성하기 위해 GeometryModel3D와 MeshGeometry3D를 이용함.

음... 그닥 책에서 건질건 없네...

췌~

'# 3) .Net ( Vs 2008 ) > WPF' 카테고리의 다른 글

[WPF] Tab 순환코드  (0) 2010.07.27
툴을 제작 해서 프로젝트를... 진행하다!  (0) 2010.02.26
데이타바인딩(2)  (0) 2009.12.28
데이타바인딩(1)  (0) 2009.12.28
이벤트 종류 & 명령 & 트리거  (0) 2009.12.28