본문 바로가기
Language/C#

[C#/WPF] Border를 Button처럼 사용하기

by 종승 2023. 3. 23.
1. Border를 활용해서 다양한 모양의 Button을 만들어 활용하고 싶었음

 

Mouse Button이 Border위에서 Down, Up 될 때 각각의 Border Thickness를 변경시켜 눌리는 것 처럼 구현

 

private void buttonDown (object sender, MouseButtonEventArgs e)
        {
            BD1.BorderThickness = new Thickness(5);
        }
        
private void buttonUp(object sender, MouseButtonEventArgs e)
        {
            BD1.BorderThickness = new Thickness(2);
        }

 

 

2. Border가 늘어날 수록 메서드의 갯수가 늘어나서 코드가 길어짐

 

모든 Border에 공통적으로 적용 할 수 있도록 변경

 

private void buttonDown (object sender, MouseButtonEventArgs e)
        {
            ((Border)sender).BorderThickness = new Thickness(5);
        }
        
private void buttonUp(object sender, MouseButtonEventArgs e)
        {
            ((Border)sender).BorderThickness = new Thickness(2);
        }

 

 

3. Border를 누른 후 Border 밖에서 마우스를 떼면 Thickness가 두꺼워진 상태에서 돌아오지 않음

 

IsMouseCaptured를 이용해서 Border밖으로 나가서 마우스를 떼더라도 정상적으로 돌아오도록 개선

 

https://jngsng.tistory.com/54

 

[WPF/C#] IsMouseCaptured

IsMouseCaptured 속성을 MS문서에서 찾아보면, " 이 요소에 마우스가 캡쳐되는지 여부를 나타내는 값을 가져옵니다. " 라고 되어있는데, 이 부분이 잘 이해가 가지 않아서 더 자세한 내용을 찾아보았

jngsng.tistory.com

 

private void buttonDown (object sender, MouseButtonEventArgs e)
        {
            ((Border)sender).BorderThickness = new Thickness(5);
            ((Border)sender).CaptureMouse();
        }
        
private void buttonUp(object sender, MouseButtonEventArgs e)
        {
            ((Border)sender).BorderThickness = new Thickness(2);
            ((Border)sender).ReleaseMouseCapture();
        }

 

 

4. Border안에 ViewBox가 있고, 그 안에 Label이 들어가있는데 Label의 속성값에 접근하는 방법을 모름

 

Boder의 자식인 ViewBox, ViewBox의 자식인 Label을 차례로 접근해서 속성을 변경함

 

자식(Child)에 접근하는 방법에 대해 구현하면서 느낌은 알겠으나 명확하게는 잘 모르겠음

" as ~ " 가 붙은 부분들에 대해서 추가적으로 알아봐야 할 것 같음

 

 

internal void MenuButtonDown(object sender)
        {
        	// Border의 Child인 ViewBox, ViewBox의 Child인 Label
            Border border = (Border)sender;
            Viewbox viewBox = border.Child as Viewbox;
            Label label = viewBox.Child as Label;

		// label의 Foreground 속성에 접근
            label.Foreground = new SolidColorBrush(Colors.Green);
            border.BorderThickness = new Thickness(5);
            border.CaptureMouse();
            
        }
        
internal void MenuButtonUp(object sender)
        {
            Border border = (Border)sender;
            Viewbox viewBox = border.Child as Viewbox;
            Label label = viewBox.Child as Label ;

            label.Foreground = new SolidColorBrush(Colors.Black);
            border.BorderThickness = new Thickness(2);
            border.ReleaseMouseCapture();
        }

 

'Language > C#' 카테고리의 다른 글

[C#/WPF] MouseDown Event 동작 안 함  (0) 2023.03.24
[C#/WPF] StackOverflowException 발생  (0) 2023.03.23
[C#/WPF] IsMouseCaptured  (0) 2023.03.20
[C#/WPF] 시리얼 통신 중 메모리 누수?  (0) 2023.03.20
[C#/WPF] Trigger  (0) 2023.03.20