문제

그래서 나는 모두 동일한 기본 레이아웃을 가진 많은 창을 갖는 응용 프로그램을 구축하고 있습니다.

  1. 메인 창
  2. 상단 모서리에 로고
  3. 제목 블록
  4. 하단에 상태 표시기
  5. 창별 컨트롤을 위한 영역입니다.

지금은 모든 창에서 이 구조를 다시 만들어야 합니다.이상적으로는 이 레이아웃을 단일 위치, 아마도 사용하기 쉽도록 사용자 정의 Window 하위 클래스에 코딩하기를 원합니다.시작하는 방법에 대한 단서가 있거나 유사한 문제에 대한 이전 경험이 있는 사람이 있습니까?

도움이 되었습니까?

해결책

아래 그림과 같이이를 달성하기 위해 창을 대상으로하는 새로운 ControlTemplate을 만들 수 있습니다.

<ControlTemplate x:Key="WindowControlTemplate1" TargetType="{x:Type Window}">
    <Border 
        Background="{TemplateBinding Background}" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}"
        >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="0.93*"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>

            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.21*"/>
                <ColumnDefinition Width="0.79*"/>
            </Grid.ColumnDefinitions>

            <ContentPresenter 
                Grid.ColumnSpan="2" 
                Grid.Row="1" 
                Content="{TemplateBinding Content}" 
                ContentTemplate="{TemplateBinding ContentTemplate}"
                />
            <ResizeGrip 
                HorizontalAlignment="Right" 
                x:Name="WindowResizeGrip" 
                VerticalAlignment="Bottom" 
                IsTabStop="False" 
                Visibility="Collapsed" 
                Grid.Column="1" 
                Grid.Row="2"
                />
            <TextBlock Text="My Logo" />
            <TextBlock Grid.Column="1" Text="My Title"/>
            <StatusBar Height="20" Grid.ColumnSpan="2" Grid.Row="2"/>
        </Grid>
    </Border>

    <ControlTemplate.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="ResizeMode" Value="CanResizeWithGrip"/>
                <Condition Property="WindowState" Value="Normal"/>
            </MultiTrigger.Conditions>
            <Setter Property="Visibility" TargetName="WindowResizeGrip" Value="Visible"/>
        </MultiTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

다른 팁

대규모 아키텍처 변화를 받아들일 만큼 용감하다면 고려해 볼 수 있습니다. 복합WPF (이전 코드명 Prism)은 Microsoft의 Patterns & Practices 담당자가 제공합니다.

여러분이 관심을 가질 만한 점은 셸에서 "영역"을 정의하는 기능입니다(예:창) 그런 다음 뷰를 사용하여 영역을 채웁니다.이는 Model-View-Presenter 패턴을 사용하여 쉘이 영역만 정의하고 배치된 항목과 직접 연결되지 않으므로 시간이 지남에 따라 쉽게 재배치될 수 있는 모델의 "뷰"를 독립적으로 개발할 수 있습니다.원칙적으로 이는 쉘을 뷰에서 분리하고 뷰를 서로 분리하는 데 도움이 되며 단위 테스트를 더 쉽게 만듭니다.ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ.

귀하의 상황은 CompositeWPF가 해결해야 하는 응용 프로그램 유형 중 하나이지만 이는 큰 도약이며 처음부터 속도를 늦추는 것입니다.

CompositeWPF의 일부로 초보자에게 혼란을 줄 수 있는 다양한 패턴을 고려해야 합니다.UnityContainer, 제어 반전, MVP(또는 모델/뷰/뷰 모델) 및 종속성 주입.

샘플 앱을 처음 시작했을 때 의아해했던 기억이 납니다. 왜냐하면 일부 뷰가 도대체 ​​어떻게 생성되었는지 명확하지 않기 때문입니다!유니티 컨테이너는 객체를 인스턴스화하고 매개변수화된 생성자를 마술처럼 호출합니다.

CompositeWPF는 귀하의 질문에 대한 우아한 솔루션이지만 단순하거나 간단한 솔루션은 아닙니다.지난 프로젝트에서 CompositeWPF를 사용한 후 다음 적절한 응용 프로그램에 다시 사용할 생각입니다.

가장 간단한 접근 방식은 창 특정 컨트롤을위한 WPF A "페이지"를 만들고 기본 창에 "프레임"을 배치하는 것입니다. 이런 식으로 멋진 탐색을 만들 수도 있습니다.

왜 "많은 창문"을 사용하고 있습니까? 탭 컨트롤이있는 단일 창만이 아닌 이유는 무엇입니까? 또는 사용자 컨트롤이있는 단일 창?

그럼에도 불구하고 귀하의 질문에 대답하기 위해 UserControls는 원하는 것으로 묘사하는 기능을 얻는 방법 중 하나입니다.

새 윈도우 클래스를 만들고 "wind

새 Windows를 시작하면 창 유형을 인스턴스화하고 특정 컨트롤을 사용하여 사용자 컨트롤을 인스턴스화하고 창의 어린이 속성에 사용자 컨트롤을 추가 한 다음 창을 표시하십시오. 이벤트 핸들러, Datacontexts 및 현재 그렇지 않은 것을 묶을 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top