라벨이 wpf인 게시물 표시

Avalondock SizeChanged event handle

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

AvalonEdit Window XP에서 IME 활성화 문제

SharpDevelop에 4.3 포함된 AvalonEdit 는 Unicode를 지원한다. ImeSupport.cs 에서 윈도우 메시지를 처리해주는데 2수준으로 동작한다. http://msdn.microsoft.com/ko-kr/library/0x02zb6d(v=vs.90).aspx http://deguls.tistory.com/entry/IMM%EA%B3%BC-IME 그런데, 아무리해도 처음 포커스를 받을때 한글이 되질 않는다. msdn forum에 질문 해도 답이없었다. 일주일 동안 힘들었다. http://social.msdn.microsoft.com/Forums/ko-KR/visualcsharpko/thread/c2d2e467-9237-495d-91e0-6efedb8467cf

AvalonEdit IME

Windows XP에서 AvalonEdit에서 IME가 3수준으로 보이도록 삽질중이다. 아직 테스트 중이라, 설명은 생략. 이정도면은 Windows7 보다 낳은 수준이라 생각된다. Win7에선 2수준으로 동작하기 때문에 입력하는 글자의 크기와 폰트를 다시 정해주어야 하는데, 같은크기와 같은 폰트로 나오기때문이다. 단점은 2수준의 IME가 windows xp에서 엉뚱한곳에 나타나는데, 같이 나타난다. 메시지를 처리했다고 알려주면 될듯한다. 더 급한게 있기때문에 패스... /*  * SharpDevelop으로 작성되었습니다.  * 사용자: MYHOME  * 날짜: 2012-05-30  * 시간: 오전 1:18  *   * 이 템플리트를 변경하려면 [도구->옵션->코드 작성->표준 헤더 편집]을 이용하십시오.  */ using  System; using  System.Collections.Generic; using  System.Text; using  System.Windows; using  System.Windows.Controls; using  System.Windows.Data; using  System.Windows.Documents; using  System.Windows.Input; using  System.Windows.Media; using  System.ComponentModel; using  System.Runtime.InteropServices; using  System.Windows.Interop; using  System.Threading; using ...

AvalonEdit 에서 x,y,length의 단어 highlight

먼저  DocumentColorizingTransformer 를 상속받아 클래스를 하나 만든다. 해당 클래스의 인스턴스는 하나만 만들어 사용해야 함으로 싱글톤이나 static 참조변수로 하나 잡아준다. 그리고, 아래와 비슷한 클래스도 하나 만든다. public   class   Description     {          public   int  col {  set ;  get ; }          public   int  line {  set ;  get ; }          public   int  length {  set ;  get ; }     } ColorizeLine 메소드를 아래와 비슷하게 override한다. protected   override   void  ColorizeLine(ICSharpCode.AvalonEdit.Document. DocumentLine  line)         {              if  (desiredList ==  null )  return ;           ...

DependencyProperty 가 Binding이 안되는 경우

xmal에서 DataTemplate 을 이용해 template을 정의할때 CheckBox등 element를 binding을 해보면 안된다. 그냥해도 안되고 DependencyProperty 에 등록해줘도 안된다. 그런데, Command 같은것들은 된다. 

RibbonControlLibrary 초기화(?) 속도 문제

http://social.msdn.microsoft.com/Forums/ko-KR/visualcsharpko/thread/27948d4a-1c12-4646-bd13-6246e4f26ed5 MSDN 포럼에 질문을 올렸는데 아무런 닶이없다. 결국 .Net Framework 4.0 Client Profile 로 환경을 다시 맞추어 게시하여 구동속도가 느린 pc에서 테스트 해보았다. 결과는 다 빨라졌다. 결국, 리본 초기화시 느려지는 문제는 원인도 모르고 넘어가야할것 같다. SQLite가 런타임 혼합한다고 불평해서 구글링해서 app.config 에 supportedRuntime 에 에트리뷰트를 하나 추가해주었다. 나머지 모듈과 unity container 가 잘 동작하는지 테스트하고 AvalonDock 2.0 베타 버전까지 테스트 해봐야겠다. * AvalonDock 은 prism 사용시 레이아웃을 저장하면 region 이 사라진다. 내공이 딸려서 수정은 못하고 AvalonDock 2.0부터는 prism을 지원한다고 하니 테스트 해봐야겠다. ============================================================= 추가로 테스트한 결과 리본컨트럴을 어셈블리 서명을 확인하는것 같다. 처음엔 리본컨트럴이란 생각을 못해서 서명확인을 하지않도록하는건 무시했었다. fx3.5에서 app.config 에 서명확인을 하지 않도록하면 빠르게 실행된다. 하지만, 네트워크 설정값에 뭔가 timeout같은 값이 있기때문에 특정pc에서 느려지는것 같다.

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

ObservableDictionary + XmlSerializer

처음엔 list와 Dictionary를 바인딩 할려고 했는데, update가 안되었다. 그래서 찾아보니 http://observabledictionary.codeplex.com/ 이런게 있었다. 역시.. 세상엔 고수가 많다. 그런데, 어제부터 object를 xml serialize 시키는데 계속 오류가 났다. 처음엔 ObservableCollection<MyObject> 때문인줄 알았는데, ObservableDictionary가 문제였다. 다시 구글링... Dictionary 가 xml serialize 되지 않았다. http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx 여기선 Dictionary에 IXmlSerializable을 구현했는데, ObservableDictionary 와 IXmlSerializable 을 상속받아 SerializableObservableDictionary 라는 무식한 클래스를 만들어 해결했다. 따로 코드는 필요없을듯하고.. 위 링크 참조하면 된다.

Avalondock + UnityContainer (1)

이미지
처음하는 C#이라 정리하면서 개념 좀 확실해 주입할려고 포스팅한다. 요구사항은 창들이 VisualStudio 처럼 docking 가능해야한다. 각 모듈은 가능한 독립적으로 개발 가능해야 한다.(협업) 나머지 요구사항은 지금 정리하고자 하는 내용과는 관계없어 일단 Dock 가능한 라이브러리와 패턴앤프랙틱스의 Composite Application Library 부분만 정리할려고 한다. Avalondock    코드플렉스( http:// avalondock .codeplex.com ) 에서 다운받을수 있으며 샘플이 제공된다. Visual Studio 와 같은 Dock 기능을 제공한다. Composite Application Library   CAB(Composite Application Block) 의 WPF 버전( http://msdn.microsoft.com/en-us/library/ff648611.aspx )으로 MVVM 패턴을 손쉽게 구현할수 있다. 요즘 많이 사용하는 프레임워크의 기본적인 IoC(Inversion of Control) , Container 등 내가 필요한 것만 있고, 적당한 예제가 있어서 선택했다. 그리고, EventAggregator 패턴이 구현되어 있어 모듈간 종속없이 통신할수 있어 결합도를 낮출수 있다. 1. 준비 VisualStudio(VS)에서 새프로젝트 만들기를 선택하고 템플릿에서 "WPF 응용프로그램"을 선택한다. 프로젝트가 생성되면 App.xaml 에서 StartupUri 를 제거한다. Window1.xaml 을 제거하고 Shell.xaml을 추가한다. 다운받은 Avalondock Manger 와 CAL을 참조추가 해준다.( 프로젝트에 LIB를 만들어 DLL파일을 넣고 참조하였음) Bootstrapper.cs 파일을 추가하고 UnityBootstrapper 를 상속받아 CreateShell을 구현한다. public class Bootstrappe...

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

WPF Resource 참조 Uri

http://msdn.microsoft.com/en-us/library/aa970069(v=VS.90).aspx 책을 읽다가 말다가 하면 나처럼 삽질하게된다. 이미지(Sample.png)나 텍스트파일을 DLL에 포함시켜 참조하고 싶을땐, 1. 해당 프로젝트 아래 Resources 폴더 아래 Sample.png 등의 파일을 추가한다. 2. Sample.png 속성에서 빌드작업 프로퍼티를 Resource 로 해준다. 3. 코드에서 사용할땐 Uri uri = new Uri("pack://application:,,,/DllName;component/Resources/Sample.png") 이상한건 위 링크를 참조했을때 아래 코드도 동작해야 할것같다. Uri uri = new Uri("pack://application:,,,/DllName;component/Img/Sample.png") 실제로 해보면 프로젝트에 Img 폴더를 추가하고 똑같이 해줘도 위 코드로는 이미지를 찾지 못한다!. 당장 내일까지 완료해야해서 폴더이름 바꿔버리고 커밋 ㅠ

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}" />  ...