2009-03-28 10 views
0

웹 사이트의 탐색 모음처럼 WPF에서 재사용 가능한 탐색 스타일 사용자 지정 컨트롤을 만들려고합니다. 그것은 내 애플 리케이션의 모든 주요 페이지에 대한 링크가 포함됩니다. 이 컨트롤은 내 NavigationWindow의 모든 내 페이지 맨 위에 올 수 있습니다. 웹 사이트와 같이 페이지 전체에 일관된 모양과 느낌을 제공합니다.WPF 스타일 활성 항목

내 문제는 현재 페이지의 링크를 다른 페이지의 링크와 다르게 스타일을 지정하는 것입니다. 그러면 내 페이지를 빠르게보고 한 페이지를 볼 수 있습니다. 컨트롤은 각 페이지에서 동일하기 때문에 어떤 페이지가 "활성"이며 해당 링크의 스타일을 적절하게 지정해야합니다.

첫 번째 생각은 각 페이지마다 하나씩 컨트롤에 활성 속성을 배치 한 다음 해당 속성을 페이지에서 true로 설정하는 것이 었습니다. 내 헤더 사용자 지정 컨트롤에 대한 컨트롤 템플릿에서 지금

<local:Header IsHomePageActive="True" /> 

, 내가 만들 수 있습니다 DataTrigger :

예 (아니면 내가 대신 많은 특성을 갖는의 열거 값을 허용 하나의 속성, 어느 쪽이든을 사용할 수 있습니다) 즉,이 속성을 시계 :

<Style.Triggers> 
    <DataTrigger Binding="{Binding RelativeSource FindAncestor, AncestorType={x:Type local:Header}}, Path=IsHomePageActive}" Value="true"> 
    <Setter ... /> 
    <Setter ... /> 
    <Setter ... /> 
    </DataTrigger> 
</Style> 

모든 배경 한 후, 여기 내 질문입니다.이 방법이 효과적이지만 트리거는 하나의 링크에만 적용되는 "IsHomePageActive"속성을 직접 참조해야하기 때문에 모든 단일 페이지에 대해 해당 DataTrigger와 모든 Setters를 복제해야합니다. 실제 스타일이 정확히 같아도 (즉, 세터가 동일 함에도 불구하고) 모든 링크에 대해 다른 스타일이 필요합니다. 유일한 차이점은 트리거가보고있는 속성입니다.

중복 된 XAML을 수백 줄까지 작성하지 않고이 작업을 수행 할 수있는 방법이 있습니까?

답변

1

목록 상자 (예 : 마스터)로 마스터 페이지/세부 정보 패턴()을 마스터로 사용하고 페이지를 세부 정보로 사용하는 것은 어떻습니까?

그런 다음 목록에서 선택한 항목의 스타일을 지정하십시오.

다른 목록 항목을 선택하면 페이지가 변경되어 다른 항목과 다르게 표시됩니다. 당신이 그런 페이지 UserControl에서 상속 문자열 제목을 가지고 목록 페이지로 종속성 속성이있는 경우

당신은 목록 상자에서 선택한 항목에 대한

 <ListBox 
       ItemsSource="{Binding Pages}" 
       IsSynchronizedWithCurrentItem="true"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Title}" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

     <ScrollViewer VerticalScrollBarVisibility="Auto" 
         Content="{Binding Pages/}" /> 

그럼 그냥 설정 스타일을 사용할 수 있습니다