안녕하세요.
컨트롤 배치하면서 F5누르면서 실행해 보면서 작업하다 보면 멈추는 경우가 많습니다.
물론 조금 기다리면 대부분 해제되어 다시 컨트롤을 배치할 수 있는 상태로 돌아오긴 합니다만,
간혹 몇 초 이상 기다려야 하는 경우도 생기고 어쩔 때는 한참을 기다려야 하는 경우가 생기기도 합니다.
제 코드에 문제가 있는 것일까요? 설정의 문제일까요. 아니면 일반적으로 그런걸까요…
이에 대한 조언이나 경험 공유해 주시길 부탁드립니다. 그리고 wpf질문이 많은 것으로 보이는데, wpf는 xml기반이라는 것만 알고 있습니다. wpf는 디자이너가 좀 더 가벼운 편인지도 궁금합니다. 가볍다고 해도 wpf포팅하는게 쉬운 일은 아니겠지요…
첫번째로,
기준은 항상 상대적이기 때문에 원하시는 답변을 위해 좀 더 구체적인 정보가 필요합니다. 가령, 윈폼 디자이너가 무겁다고 느끼시는 샘플 코드를 공유해주셔도 괜찮고, .NET Framework에서는 빨랐던것 같은데 .NET Core로 넘어오면서, 혹은 Visual Studio 2017은 빨랐는데 2019로 넘어오면서 느려졌다는 등,
원하시는 답을 드리기 위해서는 정보가 더 필요해 보입니다.
두번째로,
일반적으로 Windows Forms 디자이너와 WPF 디자이너 들 중 무엇이 더 가벼운지에 대한 부분도 첫번째와 유사한 면이 있습니다.
저의 경험을 공유 해보자면, Windows Forms 디자이너 또는 WPF 디자이너 모두 무겁다고 느껴보지는 못했습니다. 물론, 컨트롤의 개수가 많아지면 Windows Forms 디자이너의 편집 기능이 많이 느려지는 경향은 있으나, 반대로 불필요하게 컨트롤을 많이 사용한게 아닌가 하는 접근으로 해결을 합니다.
WPF의 경우 제가 경험한 환경에서는 디자이너가 힘들어할 정도로 경험하지 못했습니다.
컨트롤 배치 변경시에 디자이너에서 F5로 실행시킨 후 디버깅 모드로 실행되던 윈도우를 종료시키면 20초 정도 딜레이가 있거든요. 전 그동안 vs 문제일 가능성이 더 많다고 생각했었거든요. 그런데, 말씀해 주신 것으로 보아 그렇지 않을 가능성이 많은 것 같네요. 우선은 제가 가능성이 있는 부분들에서 대해서 하나씩 테스트 한 후에 추가적인 궁금증이 생기면 상세한 정보과 함께 댓글을 남기도록 하겠습니다.
답변 감사드립니다. 댓글들을 보니 제 코드를 분석해 가고 있는데요.
생성자는 영향이 있는 걸 전에 알고서 이 부분에 신경을 쓰고 있는데, 아직은 분석해야 할 부분이 더 있어 보입니다.
실제 멤버변수등도 생성자가 호출될 때 모두 생성이 되더라구요. 해서 프로젝트를 nullable로 하고 가능한 가볍게 만들어 보려고 방향을 잡고 있습니다.
Load이벤트도 호출되는지는 몰랐는데, 혹시 이 부분에 대한 분석방법은 어떻게 하는게 좋을까요?
답변 감사드립니다. 많이 올린다는 것은 대강 얼마나 될까요?
저도 폼이 좀 무겁긴 합니다. ㅎ
기본적으로 메인폼에 그리드와 버튼등이 30여개 있고, 탭컨트롤로 5개 정도 하위에 컨트롤이 있고,
서브폼이이 4개 정도 있는데 각각 스플리터, 탭컨트롤등에 추가되어 있으며
서브폼에는 기본적으로 그리드나 리스트컨트롤이 있고, 서브폼마다 30여개 정도의 컨트롤이 있습니다.
서브폼 중에 한곳에 webview2컨트롤이 있고요.
윈폼에서 wpf로 넘어가는 추천해 주실만한 학습 방법이 있을까요?
제가 MFC에서 윈폼으로 넘어오게 되었는데요, 당시에도 wpf가 있었는지는 모르겠는데, 윈폼이 더 비슷했거든요. mfc는 win32 api로 윈도우 프로그램을 만드는 것보다 클래스로 잘 래핑되어서 오히려 더 편하다고 느껴졌는데, wpf는 어떤 컨셉인지 궁금합니다.
@_jeonghwan wpf로 포팅하기엔 좀 부담스럽긴 한데 다음 프로젝트는 wpf로 해 보고 싶네요~
내부 로직은 다 무시하고 컨트롤의 개수로 부하도를 따지면 윈폼에서 부하가 훨씬 큽니다.
WPF는 확실히 부하가 적구요.
(저같은 경우는 이런 단점을 극복해서라도 윈폼으로 작업하는 것을 선호하는 편입니다.)
윈폼에서 디자인 영역에서 부하를 가장 많이 받는게 Panel, TableLayoutPanel, TabControl 처럼 Container 역할을 하는 컨트롤입니다.
구글 검색해보시면 간단하게 DoubleBuffering을 구현하는 소스가 많이 나와있으니,
개인적으로는 이런걸 참조하셔서 기본 컨트롤을 상속받은 컨트롤을 생성해서 쓰시는 것을 추천드립니다.
글쓰신 분께서는 이미 해결을 다 하셨겠지만 혹시나 다른 분이 나중에 이 글을 보셨을 때 참고하시라고 뒷북 댓글 한번 달아봤습니다.
이해해주세요
뒷북 댓글을 또 늦게 보았네요.ㅎㅎ
제가 그 무거은 것들을 모두 사용하고 있었네요.
사실 문제를 제대로 해결하지는 못하고 있었는데요. 더블버퍼링이 가볍다면 기본으로 추가해 줬으면 좋았을텐데 아쉬움이 남네요. 아무튼 여유가 될 때 컨테이너 교체를 해 봐야겠네요.
감사드립니다.