2014-04-17 2 views
2

설계 용으로 가고 싶은 곳에서 응용 프로그램을 작성하면 dockpanel을 생각 나게 할 수 있습니다.Wpf 디자인; 하나의 창에 여러 개의보기가 있습니다.

내가 원하는 것은 응용 프로그램의 다른 영역 (예 : "밀크", "빵")을 나타내는 버튼이 왼쪽면 (또는 왼쪽 패널)에 있고 중간 패널에 다른 "보기"가있는 것입니다.

내가 "Frontpage"로 응용 프로그램을 만들고, 전체 윈도우/사용자 정의 컨트롤을 변경하는 중입니다.하지만 정적 영역/패널을 제공하지는 않습니다.

나는 tabtitemstrip이 세로 인 tabcontrol을 사용하고 싶지 않습니다. 그러나 비슷한 기능을 갖고 있습니다.

아이디어가 있으십니까? 다음은

좀 내 생각의 아이디어 .. 감사합니다 어떤 도움 : 당신이 WPF를 사용하는 경우

http://s57.photobucket.com/user/RolleKn/media/wpfdesign_zps3737b014.jpg.html

+0

실제로 무엇을 묻고 있습니까? 무슨 문제 있니? 독 패널을 사용하여 이것을 매우 쉽게 레이아웃 할 수 있지만, 이미 언급했듯이 다른 것을 의미한다고 생각하십니까? – BenjaminPaul

+1

아, 맞아. 내 질문은 : 어떤 종류의 컨테이너를 다른 "보기/페이지"를 보유해야합니까?. 내 말은 - 예를 들어 서로 다른 그리드를 서로 붙일 수 있고 어떤 버튼을 눌렀는지에 따라 각각의 그리드를 보이게하거나 숨길 수 있습니다. – rollekn

+0

@rollekn 프리즘 라이브러리를보고 복합적인 사용자 인터페이스를 만드는 방법 MVVM 방식의 WPF. – Mashton

답변

10

는, 그것을위한 ContainerControl 또는 ContentPresenter를 사용을주고는 바란 디자인 사진입니다.

일반적으로 "가시성 켜기/끄기"는 좋은 방법이 아닙니다. UI가 모든 객체 (보이지 않는 객체도 포함)를 만들고 데이터 및 이벤트 등을 처리하도록합니다.

그리고 수동으로 전환해야합니다.

WPF는이를 저장하는 많은 메커니즘을 제공합니다. 일부는 다른 것보다 더 똑똑합니다.

WPF에서 가장 기본적인 메커니즘 중 하나는 Control 및 그 Template 속성입니다. 당신은 하나의 Control으로 그리드 + 내용 + SwitchingVisibility 아이디어를 전체 교체하고 전환 할 수는 Template : 이제

<Window.Resources> 
    <ControlTemplate x:Key="panel1"> ..carrots.. </ControlTemplate> 
    <ControlTemplate x:Key="panel2"> ..cucubers.. </ControlTemplate> 
    <ControlTemplate x:Key="panel3"> ..donkey.. </ControlTemplate> 
    ... 
</Window.Resources> 

<Grid x:Name="LayoutRoot"> 
    <Control x:Name="foo" /> 
</Grid> 

, 당신은 foo을 얻을하고 .Template을 설정하고, panel1에 다음 "당근"을 설정하면 것이다 나타나다. panel3으로 설정하면 당나귀. 등등.

매우 강력하지만 필자가 다루지 않을 다른 것들이 있기 때문에 실제로는 유용하지 않을 것입니다. 템플릿을 자세히 설명하는 책과 자습서가 있습니다. 또한이 메커니즘 은 실제로 이러한 작업을 위해 설계되지 않았습니다. 가장 기본적인 것이고, WPF로 작업하고 싶다면 알아두면 좋지만, 여기에 더 적합한 것들이 있습니다.

두 번째로 강력하고 기본적인 기본 메커니즘은 ContentControl/ContentPresenter입니다. 거의 동일한 방식으로 작동합니다 (실제로 CC는 내부적으로 CP를 사용합니다). 그래서 건너 뛸 것입니다.

은 ContentControl은 당신이 제시 tryng하는 데이터에 대한 올바른 템플릿을 선택하는 방법을 자동으로 알고있는 스마트 컨트롤입니다.

그래서 :

<Window.Resources> 
    <DataTemplate DataType="CarrotData"> ..carrots.. </..> 
    <DataTemplate DataType="CucumberData"> ..cucubers.. </..> 
    <DataTemplate DataType="DonkeyData"> ..donkey.. </..> 
    ... 
</Window.Resources> 

<Grid x:Name="LayoutRoot"> 
    <ContentControl x:Name="foo" Content="{Binding ..}" /> 
</Grid> 

주 'DataTemplate을'을 '은 ControlTemplate'에서 변경할 수 있습니다.
이제이 설정을 사용하면 템플릿을 수동으로 전환 할 필요가 없습니다. 당신은 단지 "foo는"을 얻을에 하나의 내용을 설정

  • CarrotData 객체, 즉, 당근 관련 데이터를 오이 관련 데이터를 포함
  • CucumberData 객체를 포함
  • DonkeyData 객체, 당나귀 관련 데이터가 포함되어 있음

표시 할 데이터를 설정하면 (예 : foo.Content = carrots[5]) ContentControl은 표시 할 관련 템플릿을 선택합니다.

당신은Content 속성을 거의 모든 것에 바인딩 할 수 있습니다. 당근/당나귀가 들어있는 데이터 클래스가 있고 속성이 CurrentThing 인 경우 바인딩 할 수 있으며 ContentControll은 CurrentThing에 대한 변경 사항과 함께 자동으로보기를 전환합니다.

기본 사항입니다. 거의 모든 점에서 간단히 다루려고 노력했습니다. 지금은 ControlTemplates를 그대로 두십시오. DataTemplates와 Bindings에 대해 읽어보십시오. ContentPresenter (1 개 항목에 대해 1 개 템플릿 표시) 및 ItemsControl (N 개 항목 + 템플릿 표시)에 대해 읽습니다. 그런 다음 MVVM 패턴을 조금 읽으십시오.

"모든 것이 하나의 그리드에 있음"과 "가시성 전환"이 이상하게 느껴질 것입니다.

그러나 모든 항목에 비용이 포함되어 있다고 언급하지 않으면 나는 공정하지 않을 것입니다. 템플릿과 바인딩을 광범위하게 사용하면 수동으로 모든 작업을 수행 할 때 얻을 수있는 것과 비교하면 앱이 약간 느려집니다. 그러나 일반적으로 수동으로 수행하는 것은 가치가 없습니다.

관련 문제