본문 바로가기

C#/WPF8

OneWay와 TwoWay 바인딩을 하면 Window의 Width를 줄여서 TextBox의 Text를 바꾸거나, 그 역이 가능하다. 그러나 일방향으로만 Binding이 되도록 만들고 싶을 수 있다. Mode=OneWay를 추가하면, Window의 크기를 늘리거나 줄일 때만 TextBox의 값이 변한다. TextBox의 값을 수정한다고 Window의 Width가 변하진 않는다. 즉 Window -> TextBox 방향이다. OneWay를 OneWayToSource로 바꾸면 OneWay의 역일방향이 된다. 즉 TextBox -> Window 방향이다. Source는 당연히 Window를 의미한다. 2023. 3. 1.
Binding - UpdateSourceTrigger xaml을 보면 Window의 Title에 TextBox의 Text를 바인딩함으로써, 텍스트 박스에 글자를 입력하면 실시간으로 윈도우의 제목이 바뀔 것처럼 보인다. 하지만 실제로 실행시켜보면... 글자를 아무리 써도 제목이 비어 있는 상태다. 이는 UpdateSourceTrigger가 TextBox의 Focus를 잃을 때로 되어있기 때문이다. ​ UpdateSourceTrigger=PropertyChanged를 추가해주면 속성이 바뀔 때마다 Update를 해서 글자를 입력함과 동시에 제목이 바뀌는 것을 볼 수 있다. 2023. 3. 1.
RelativeSource Binding RelativeSource를 이용하면 c# 코드 없이 순수 xaml로만 바인딩을 할 수 있다. 실행 결과는 아래와 같다. 보다시피 Window의 ActualWidth가 Label의 Content에 바인딩이 됐다. 2023. 3. 1.
DataContext Binding 별도의 타겟을 지정하지 않고 Path만 써 놓으면 DataContext를 읽게 된다. DataContext는 기본적으로 null이기 때문에, 개발자가 직접 지정해주어야 한다. 위는 xaml, 아래는 cs using System.Windows; namespace IamNamespace { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = this; } } } 이렇게 하면 MainWindow의 Title에 ActualWidth를 바인딩할 수 있다. 2023. 3. 1.
[C# WPF] Binding Binding이란? WPF에서 쓸 수 있는 기술이다. 쓰는 방법은 무척 간단하다. 큰 따옴표 안에 {Binding}을 써 주기만 하면 끝이다. Binding을 사용할 수 있는 가장 단순하고 쉬운 방법은 ElementName을 지정한 후 그 Element의 속성을 Path로 지정해주는 것이다. 실제로 저 프로그램을 실행해보면... 프로그램 창의 Title이 ActualWidth와 실시간으로 동기화되는 것을 볼 수 있다. 2023. 2. 18.
[C# WPF] super mario 63의 cheat를 구현해 보자. super mario 63에는 "cheat"를 입력하면 모든 것을 잠금 해제할 수 있는 창이 나온다. wpf에서도 창에 cheat를 입력하면 이벤트가 발생하도록 할 수 있을까? using System.Windows; using System.Windows.Input; namespace cheat { public partial class MainWindow : Window { private int cheatIndex = 0; private Key[] cheatKeys = {Key.C, Key.H,Key.E,Key.A,Key.T}; public MainWindow() { InitializeComponent(); } protected override void OnKeyDown(KeyEventArgs e) { b.. 2023. 2. 3.
[C# WPF] 연속해서 여러 번 클릭하는 것을 방지해보자. 다음과 같은 코드가 있다. public partial class MainWindow : Window { private void Button_Click(object sender, RoutedEventArgs e) { Thread.Sleep(500); Title += "a"; } } Title을 수정하는 코드가 0초가 걸린다고 하면 이 버튼은 클릭을 할 때마다 0.5초가 걸리는 작업을 한다. 근데 클릭을 한 번 하고 나서 0.5초의 작업을 하는 동안 한 번 더 클릭하면 클릭이 예약이 되어버린다. 버튼을 눌렀더니 0.5초 동안 무응답이길래 한 번 더 눌렀는데 1초를 기다려야 하는 셈이다. 성질 급한 사람은 3번 이상 누를지도 모른다. 그럼 무응답인 시간은 계속 길어지고, 스트레스는 증가하고, 버튼은 계속 누르.. 2023. 1. 20.
[C# WPF] Ctrl Z 감지하기 private void Window_KeyDown(object sender, KeyEventArgs e) { if(e.Key==Key.Z && e.KeyboardDevice.Modifiers == ModifierKeys.Control) { Console.WriteLine("wow"); } } 실험해본 결과 Z를 먼저 누르고 Control을 누르면 wow가 출력되지 않는다. 2023. 1. 9.