6월, 2011의 게시물 표시

C# 객체 생성 성능

파이프로 분리된 4개의 컬럼, 18만라인을 읽어서 List에 넣었더니... 한참걸린다. 아래를 객체생성 루프이다. GC가 일어날때를 제외하고는 struct이 훨씬 빠르다.(물론 Object의 장점은 모두 없어진다.) class Program { class MyObject { public string Col1 { set; get; } public string Col2 { set; get; } public string Col3 { set; get; } public string Col4 { set; get; } } struct MyStruct { public string Col1; public string Col2; public string Col3; public string Col4; } static void Main(string[] args) { { ArrayList mylist = new ArrayList(); DateTime p = DateTime.Now; for (int i = 0; i < 2000000; i++) { MyObject m = new MyObject(); m.Col1 = "1"; m.Col2 = "2"; m.Col3 = "3"; m.Col4 = "4";

Blogger.com에서 코드 하일라이팅(Syntax Highlighting)

http://alexgorbatchev.com/SyntaxHighlighter/manual/installation.html 여기서 참고했다. 짱인듯. 사용법은 하면된다.

WPF Template에 Grid 사용하기( UniformGrid, Grid, WrapPanel)

상식적으로 WrapPanel에 Orientation을 수평으로 하고 객체를 추가하면 차례대로 wrap되면서 객체가 추가되어야 한다. Grid는 Row나 Column 을 define 해놓지 않으면 Grid크기로 strech되기 때문에 RowDefinition등을 사용해서 matrix를 만든다. 그럼... WrapPanel에 템플릿을 사용해 버튼을 그리면? 당연히 차례대로 들어갈거라 생각했는데 첫번째줄, 두번째줄.... 하나씩 들어간다. 이건뭐... StackPanel 도 아니고.. 아직 WPF에 대한 이해가 부족한 것 같다.(책을 읽다가 말아서 이 고생을 하는것 같다.) MSDN을 보면 ItemsPanel을 사용해서 내가 구현하고자 하는걸 비슷하게 해놓았더라. 덕분에 ItemsPanel이란 검색어를 획득(?)해서 구글링 해보았더니 딱 원하는게 나왔다. <ItemsControl ItemsSource = "{Binding Path=PositionList}" >     <ItemsControl.ItemsPanel>         <ItemsPanelTemplate>             <UniformGrid Rows = "12" Columns = "4" />         </ItemsPanelTemplate>     </ItemsControl.ItemsPanel>     <ItemsControl.ItemTemplate>         <DataTemplate >             <TextBlock Text = "{Binding State}" />         </DataTemplate>     </ItemsControl.ItemTemplate> </ItemsControl> public class Posi

WPF 이미지위에 라인 그리기(WPF DrawLine on exist Image)

WPF 기초가 부족해 삽질 한참 하다가 별것 아닌 방법으로 해결했다. 처음엔 Canvas위에 그릴려고 Canvas객체를 가져왔는데 WinForm 처럼 Graphics를 가져올수 없었다. 구글링해보면 제목은 WPF이고 Graphics를 가져와 그걸로 그리는 예제가 있어서 쉽게 끝날줄 알았는데, 한참 헤매었다. 답은 간단하다. 캔버스에서 이미지 다음에 객체를 추가하면 끝난다.(허무했다 ㅠ ) <Canvas Name="myCanvas">     <Image ImageSource="....."/>     <Line X1="10" Y1="10" X2="100" Y2="200" /> </Canvas> 동적으로 추가하는  코드도 마찬가지다  myCanvas.Children.Add( new Line{X1=10,Y1=10,X2=100,Y2=200} ); ViewModel로 바인딩해서 많은 선을 그렸었는데 역시 마찬가지로 이미지다음에 Template을 추가해 바인딩 해놓으면 쉽게 된다.

WPF RichTextBox 에서 대문자만 입력가능한 것처럼 보이게

아무리 찾아봐도 RichTextBox 에서 입력 마스크가 없다. AvalonControlLibray에 MaskedTextBox가 있어서 사용해봤는데 답이 안되었다. 구글링하다가 비슷한 코드를 발견하고 수정했다. richTextBox2_TextChanged가 현재 핸들러이다.             RichTextBox _rtbEdit = sender as RichTextBox;             _rtbEdit.TextChanged -= richTextBox2_TextChanged;                         string sPrev = _rtbEdit.Selection.End. GetTextInRun(LogicalDirection. Backward);             int i;             for (i = sPrev.Length - 1; i > -1; i--)             {                 if (Char.GetUnicodeCategory( sPrev[i]) != UnicodeCategory. NonSpacingMark) break;             }             if (i == -1) return;             // replace target character with new, keeping any following nonspacing char             StringBuilder sb = new StringBuilder();             sb.Append(sPrev[i]);             if (i + 1 < sPrev.Length) sb.Append(sPrev.Substring(i + 1));             string sNew = (sb.ToString()).ToUpper();             _rtbEdit.Selection.End. DeleteTextInRun(i - sPrev.Length);

Model-Model of View-View(MVVM) Pattern

디자인 패턴중 하나인 MVC는 1979년에 그 개념이 나왔다.(1980년이가?) 2004년 마틴파울러가 PM 패턴을 말하였고,  그후 MVP(Model-View-Presenter) 패턴, MVVM 패턴이 나왔다. 10여년전에 CGI/C를 이용해 웹페이지를 만들때 View를 분리해보았다. 함수포인터를 이용해 View를 교체하였는데... 그때가 즐거웠다. ㅋ  또.. 주제하고는 관련없는 ...  MVVM패턴은 구글에서  mvvm 하면 관련 자료가 많이 나온다. 먼저 msdn 자료( http://msdn.microsoft.com/ko-kr/magazine/dd419663.aspx )와  codeproject 자료( http://www.codeproject.com/KB/WPF/MVVMQuickTutorial.aspx ) 가 정리가 잘되어있었다. 이해할 수 있을만큼 예제와 설명이 있다. 역할을 정리해보면 ... View : User Interface 이다. data를 표현해준다. user와 interaction한다.  ViewModel : View에서 필요한 데이터와 사용자 입력에서 model과 관계를 처리한다. Model : Data와 Buisiness logic 을 처리한다. Model은 ViewModel의 존재를 모르고, ViewModel은 presenter에서 처럼 view의 참조는 필요없다.  WPF의 이벤트(Event) 시스템을 이용해, ViewModel에서 데이터 변경이 일어날때 View는 해당 이벤트를 수신하여 View를 다시 랜더링한다.  이때 WPP에서 View는 보통 xmal로 작성되며 DataContext 를  ViewModel로 참조, 바인딩된다. 데이터의 validate는 Model이 담당하며 ViewModel은 View의 추상화이다.  MVVM은 WPF에서 좀더 특화된 PM패턴이라고 위 msdn링크에서는 말하고 있다. View는 INotifyPropertyChanged 이벤트를 수신함으로써 Model이 변경될때 View를

WPF RichTextBox 에서 현재 라인번호

최근 닷넷 프로젝트를 진행중이다. UnityContainer와 MVVM 패턴을 적용하기 위해 MVVM 패턴 학습중인데, 이전에 Spring을 이용해 Web 프로젝트를 해봐서, DI(Dependency Injection), IoC(Inversion of Control) 등 개념을 알고 있어 UnityContainer 는 대충 사용하는데, MVVM 은 Web에서 MVC와 MVP 의 차이점이 명확하게 개념이 잡히질 않는다. 어쨋든.. 오늘 블로깅할건 RichTextBox에서 당연히 라인번호를 가져올 수 있을지 알았는데 한참 뒤져도 없었다. 결국 구글링해보고 참고해서 아래 코드를 작성하였다. /// <summary> /// RichTextBox 의 현재 캐럿의 라인번호를 리턴한다. /// </summary> /// <param name="rtb"></param> /// <returns > int </returns> private int GetLineNumber( RichTextBox rtb) {         TextPointer caretLineStart = rtb.Caretposition.GetLineStartPosition(0);          TextPointer tp = rtb.Document.ContentStart.GetLineStartPosition(0);         int lineNumber = 1;         if (caretlineStart.CompareTo(tp) < 0)        {                 return lineNumber;        }         while (true)        {                 int rs=0;                 tp = tp.GetLineStartPosition(1, out rs);                 if (rs