2009-04-30 10 views
135

저는 WPF에서 속도를 높이기 위해 재사용 가능한 WPF 컨트롤을 만들고 싶습니다.사용자 정의 컨트롤 라이브러리와 사용자 지정 컨트롤 라이브러리의 차이점은 무엇입니까?

Visual Studio에서 프로젝트를 만드는 옵션을 보면 "WPF 사용자 정의 컨트롤 라이브러리"와 "WPF 사용자 지정 컨트롤 라이브러리"가 나타납니다. 그들 사이에 차이점이 무엇인지 나에게 명확하지 않다. 구글 검색은 괜찮은 설명을하지 않았다.

나는 그들 사이의 차이점을 이해하고 이상적으로 서로를 사용하는 경우의 몇 가지 예를보고 싶습니다.

+2

내용을 중첩하거나 컨트롤 템플릿을 옵션으로 변경하는 것을 잊지 마십시오. 사용자 정의 컨트롤을 작성하지 않고도 이런 식으로 컨트롤을 극적으로 변경할 수 있습니다. – MichaC

+0

미카엘이 말한 바로 그 것이다. WPF의 가장 중요한 부분은 템플릿 기존 컨트롤이 큰 영향을 미칠 수 있다는 것입니다. 드물게 사용자 지정 컨트롤이 필요합니다. 이는 WinForms와 달리 컨트롤을 약간만 변경해도 새로운 파생 컨트롤이 필요했습니다. –

+0

여전히 유용합니다. 다른 금의 배지를 가져라. – ouflak

답변

99

실제로 사용자 지정 컨트롤은 코드 수준에서 구현하는 반면 사용자 정의 컨트롤에는 XAML을 사용할 수 있습니다. 사용자 지정 컨트롤은 WPF 컨트롤 기본 클래스 중 하나를 확장하고 코드를 통해 추가 기능을 제공하므로 추가 된 모든 논리 및 표현을 코드 내에서 구현해야합니다.

사용자 정의 컨트롤은 기술적으로는 코드의 일부 부분에서 확장 할 수 있지만 일반적으로 다른 컨트롤을 배치하여 확장됩니다. 따라서 Kent가 언급 한 것처럼 UserControl은 다른 컨트롤의 집합입니다. 이렇게하면 사용자 정의 컨트롤을 사용하여 수행 할 수있는 작업이 상당히 제한됩니다. 사용하기 쉽지만 전체 사용자 정의 컨트롤보다 더 제한적입니다.

이러한 컨트롤은 런타임 시점과 약간의 차이가 있습니다. 응용 프로그램을 빌드하고 UserControl을 배치 할 때 컨트롤 트리에는 내부에 구체적인 UserControl 템플릿이 있습니다. 그래서 우리가 전문화 된 버튼의 불충분 한 예를 고려한다면. 사용자 정의 컨트롤을 사용하는 경우 <UserControl> 요소 안에 버튼을 추가하십시오. 사용자 정의 컨트롤을 사용할 때 가장 자주 버튼에서 컨트롤 자체를 파생시킵니다. 차이점은 논리적 트리에서 볼 수 있습니다.

사용자 지정 컨트롤이 CustomButton

    • 유사한 논리적 트리를 제공 할 수 있지만

      해당 UserControl은

        의 논리적 트리를 줄 것이다
        • CustomButtonUserControl
          • 버튼

      그래서 결국 UserControl을 당신이 조금 연장 할 수 있고있는 당신이 미리 정의 할 수 있습니다 만 보통은 ContentControl이다 내용. 사용자 지정 컨트롤은 XAML의 이점을 얻는 대신 코드에서 모든 논리 및 상호 작용을 수행해야하기 때문에 구현 유연성이 뛰어나 유연성을 제공합니다.

      그러나 이것 이후로는 Visual Studio 템플릿에 많은 차이가 있다고 생각하지 않습니다. Visual Studio 사용자 지정 컨트롤은 빈 사용자 지정 컨트롤이있는 프로젝트를 만드는 반면 사용자 컨트롤 프로젝트는 빈 사용자 컨트롤이있는 프로젝트 일 가능성이 큽니다. 나중에 모든 종류의 항목을 프로젝트에 추가 할 수 있습니다.

      업데이트

      그리고 사용자 지정 컨트롤을 사용하여 사용자 컨트롤이시기에 대한 내 의견 당신이 사용자 제어 및 당신을 귀찮게하지 않습니다 논리적 트리에서 별도의 제어 요소 함께 할 뭔가를 얻을 수 있다면, 사용자 정의 컨트롤을 사용하면 훨씬 쉽게 만들고 유지 관리 할 수 ​​있습니다. 사용자 정의 컨트롤을 사용하지 않을 이유가있는 경우에만 사용자 정의 컨트롤을 사용하십시오.

+1

다른 컨트롤을 집계하는 데 사용자 지정 컨트롤을 사용할 수 있습니까? –

+0

그리고 skinnable/templatable 문제는 어떻습니까? –

+1

집계를 의미하는 것이 확실하지 않습니다. 다른 컨트롤을 집계하여 사용자 지정 컨트롤을 만들 수는 없습니다. 그러나 StackPanel, Grid 또는 Panel 자체와 같은 Panel 컨트롤에서 파생 될 수 있으므로 사용자 정의 컨트롤로 레이아웃 컨테이너를 구현할 수 있습니다 (사용자 정의 컨트롤로 수행 할 수 있는지 확실하지 않음). –

21

Control은 스킨 가능 (템플릿 가능) 인 일부 동작을 나타내지 만 UserControl은 일반적으로 응용 프로그램에 특정한 Control의 상위 수준 집계입니다.

자세한 정보는 here입니다.

+3

그건 내가 잘 찾지 못했던 링크 중 하나입니다 :). 내가 누락 한 한가지는 skinnable/templatable이 실제로 의미하는 바이며 사용자 정의 컨트롤을 사용하여 수행 할 수없는 이유입니다. 또한 링크 된 게시물의 마지막 문장은 "일반적으로 사용자 정의 컨트롤은 사용자 컨트롤보다 유연성과 재사용 성이 뛰어납니다."입니다. 그것이 사실이라면 왜 사용자 컨트롤을 만들고 싶습니까? –