라벨이 c#인 게시물 표시

Avalondock SizeChanged event handle

DockableContent의 SizeChanged Event에 핸들러를 붙여보면 동작하지 않는다. 결국 아발론닥 소스를 수정할 수 밖에 없었다. dockmanger의 크기와 dockablecontent의 영역의 위치와 크기를 알기 위해서는 소스의 prviate 부분을 public 으로 바꾸던지 readonly 속성을 추가해줘야한다.

WPF RichTextBox 의 기본 단축키 해제

RichTextBox의 Ctrl + I 같은 기본 단축키는 그냥 덮어씌우니 동작이 안되었다. 구글신에게 도움을 요청해서 겨우 찾았다. 아래 코드로 해제시킨후 쓰고자하는 command를 바인딩 한다. =========================아래 ============================== KeyBinding  keyBinding =  new   KeyBinding ( ApplicationCommands .NotACommand,  Key .L,                                                           ModifierKeys .Control);             richTextBoxMain.InputBindings.Add(keyBinding);             keyBinding =  new   KeyBinding ( ApplicationCommands .NotACommand,  Key .I,          ...

C# 에서 process invoke(fork)

c#에서 다른 프로세서를 호출하고 리턴값을 받기위한 소스이다. ==일단 c++===================================== #include   "stdafx.h" #include <iostream> int  _tmain( int  argc, _TCHAR* argv[]) { return  -12; } ===================================== == c#에서는 ================================= using  System; using  System.Diagnostics; using  System.Runtime.InteropServices; namespace  ConsoleCreateProcess {      public   struct   PROCESS_INFORMATION     {          public   IntPtr  hProcess;          public   IntPtr  hThread;          public   uint  dwProcessId;          public   uint  dwThreadId;     }      public   struct   STARTUPINFO  ...

C#에서 포인터 사용

훈스닷넷에 답글달고 정리 차원에서 남겨둔다. C#에서는 C에서 처럼 포인터를 사용할수가 있다. 빌드옵션에서 안전하지 않은 코드 check 해주고 다음과 같은 방법으로 한다.         static void Main(string[] args)         {             foo();         }         unsafe static void foo()         {             Int64 aa = 123456789;             Int64 bb = 123222;             IntPtr pt = new IntPtr(&aa);             IntPtr pt2 = new IntPtr(&bb);             Console.WriteLine(pt.ToString("x"));             Console.WriteLine(pt2.ToString("x"));             Int32 a = 1234231;             Int32 b = 154324;             IntPtr pt3 = new IntPtr(...

C# LINQ 예제

문자열에서 중복되는 값을 찾고 싶을때 LINQ 를 이용해서 아래와 같이 하면 된다. ( LINQ 오늘 처음 써봐서 예제가 허접합니다)             string t = "a,b,c,d,e,e,e,f,g";             var r =                 from n in t                 group n by n into g                 where g.Count() > 1                 select g;             foreach (var a in r)             {                 Console.WriteLine(a.Key );             } , 도 문자열로 인식되서 split 해줬다.             string t = "a,b,c,d,e,e,e,f,g";             var r =                 from n in t.Split(',')       ...

WPF 드래그앤드랍

어떤 분이 질문을 올리셨길레 궁금해서 해보았다. 연습삼아 ListView에 Button 을 넣어주고 드래그해서 canvas에 놓는 테스트이다. 먼저 Xaml <Window x:Class="WpfApplication3.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="342" Width="300"> <Grid Height="253" Width="269"> <Grid.ColumnDefinitions> <ColumnDefinition Width="15*" /> <ColumnDefinition Width="131*" /> </Grid.ColumnDefinitions> <Canvas x:Name="mycanvas" DragDrop.DragOver="mycanvas_DragOver" DragDrop.DragEnter="Canvas_DragEnter" DragDrop.DragLeave="mycanvas_DragLeave" Drop="mycanvas_Drop" Mouse.MouseMove="Canvas_MouseMove...

WPF RichTextBox 와 Document의 바인딩

MVVM 패턴을 이용해서 View의 TextBox 등에 바인딩은 간단하게 <TextBox Text="{Binding mystring}"/> 이렇게 하면 된다. RichTextBox 도 마찬가지 일것 같지만, 해보면 안된다. 먼저 RichTextBox가 Content를 표현하는 구조를 알아야 되는데, 그건, 다음에 정리하고, 바인딩 하는 방법은 아래와 같다. 먼저 ViewModel 을  DependencyObject 를 상속고 DependencyProperty 를 정의해준다. public class MyViewModel : DependencyObject { public FlowDocument Document { get { return (FlowDocument)GetValue(DocumentProperty); } set { SetValue(DocumentProperty, value); } } public static readonly DependencyProperty DocumentProperty = DependencyProperty.Register("Document", typeof(FlowDocument), typeof(MyViewModel), new PropertyMetadata(OnDocumentChanged)); public void OnDocumentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { } } 그 다음 View 의 code-behind 의 생성자에 InitializeComponent(); Binding b = new Binding("Document"); b.Source = richTextBox; b.Mode = BindingMode.OneWay; BindingOperations.SetB...

C# 정규식

.Net에서는 정규식을 위해 Regex 라는 클래스를 제공한다. Regex 클래스는 System.Text.RegularExpressions 네임스페이스에 있다. 우선 전화번호는 Regex regex = new Regex(@"\d{3}-\d{3,4}-\d{4}"); \d 는 [0-9] 와 같은 표현식이며 실제로 전화번호는 전부 0으로 시작하기때문에 0 이라고 써도된다. Regex regex = new Regex(@"0\d{2}-\d{3,4}-\d{4}"); 두번째 자리는 핸드폰의 경우는 모두 1 이므로 아래와 같이 수정할수 있다. Regex regex = new Regex(@"01\d-\d{3,4}-\d{4}"); {n} 은 반복되는 횟수이다. \d 는 숫자라는 뜻이다. 첫번째 \d{3} 은 숫자가 3개 반복된다는 뜻이다. 대쉬 "-" 는 그대로 인식된다. \d{3,4} 는 숫자가 3자리에서 4자리라는 표현이다. 여기까지면 전화번호 표현은 끝이다. 첫번째 표현은 아래와 같이 다르게 표현할수 있다. Regex regex = new Regex(@"[0-9]{3}-[0-9]{3,4}-[0-9]{4}"); [0-9] 는 0에서 9 사이의 문자가 올수 있다는 뜻이다. [0-9]{3} 는 0에서 9사이의 문자가 3번 반복된다는 뜻이다. 그럼, 아래 예제를 실행해보자. static void Main(string[] args) { Regex regex = new Regex(@"\d{3}\-\d{3,4}\-\d{4}$"); string[] target = { "011-333-1234", ...

C# WPF Cross-thread problem

WFP를 이용해서 어플리케이션을 개발중이다. 예외 메시지는 "다른 스레드가 이 개체를 소유하고 있어 호출한 스레드가 해당 개체에 액세스할 수 없습니다." UI를 다른 쓰레드에서 update 할려고 하면 UI를 담당하는 쓰레드가 해당 컨트럴(객체)를 사용하고 있어 접근 할 수가 없다. 이렇게 다른 쓰레드가 사용하는 객체를 다른 쓰레드에서 접근할때 생기는 문제를 Cross-thread라고 한다. 해결방법은 새로만든 쓰레드에서 UI를 update 할때 UI쓰레드에게 할일을 위임해주면 된다. Winform에서는 Invoke 메소드를 이용하고 WPF에서는 Dispatcher.Invoke를 이용하면 된다. 예제는 구글링으로 ~ 구글링은 c# wpf cross thread 등으로 검색하면된다. http://www.google.co.kr/search?gcx=w&sourceid=chrome&ie=UTF-8&q=c%23+cross+thread+wpf+dispatch

C#, BinaryReader , Java , ReadDouble

자바에서 ReadDouble() 로 잘 읽어서 사용하였는데 C#에서 ReadDouble() 로 하니 엉뚱한 값이 나온다. window 머신이었는데, hex 값을 보니 little endian 이었다. java로 돌렸을땐 잘돌아가서, 아무 생각없이 하다 삽질만 했다. 어쨌든 해결 방법은 간단하다. http://msdn.microsoft.com/en-us/library/bb384066.aspx 바이트 배열로 읽어서 뒤집어 준다음 Double로 바꿔주면 된다. BitConverter.ToDouble(bytes);

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"; ...