Pergunta

Eu estou tentando criar um estilo de navegação reutilizável controle personalizado em WPF, como uma barra de navegação em um site. Ele irá conter links para todas as principais páginas do meu aplicativo. Esse controle pode ir em cima de todos os meus Páginas na minha NavigationWindow. Dando uma aparência consistente agradável e sensação entre páginas, como um website.

Meu problema é no estilo de ligação da página atual de forma diferente do que as ligações das outras páginas, de modo que você pode rapidamente olhar para ele e ver qual a página que você está. Desde que o controle é o mesmo em cada página, eu preciso dizer-lhe que a página é "ativo" e tê-lo estilo que apontam de forma adequada.

O meu primeiro pensamento foi simplesmente lugar é propriedades do Active no controle, uma para cada página, em seguida, defina a propriedade adequada para true na página. (Ou eu poderia usar uma propriedade que aceita um valor de enumeração em vez de ter muitas propriedades, de qualquer forma)

Exemplo:

<local:Header IsHomePageActive="True" />

Agora, no modelo de controle para o meu cabeçalho controle personalizado, eu posso criar um DataTrigger que assiste esta propriedade:

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

Depois de todo esse fundo, aqui está a minha pergunta. Isso funciona, mas eu vou ter que duplicar esse DataTrigger, e todos os Setters em que, para cada página que eu tenho, porque o gatilho tem de fazer referência a propriedade "IsHomePageActive", que só se aplica a um link diretamente. Então eu preciso de um estilo diferente para cada link, mesmo que o estilo real a sua descrição é exatamente o mesmo (pelo qual quero dizer, os Setters são os mesmos). A única diferença é que propriedade o gatilho está assistindo.

Existe alguma maneira de fazer isso (ou algo com o mesmo resultado final) sem acabar com centenas de linhas de XAML duplicado?

Foi útil?

Solução

Que tal usar um padrão master / detail () com uma caixa de listagem (digamos) como o mestre e suas páginas como os detalhes.

Em seguida, especifique o seu estilo para o item selecionado na lista.

A página irá mudar quando um item da lista diferente é selecionada e ele vai olhar diferente para os outros itens.

Se você tem uma propriedade de dependência, tais como a lista de páginas em que herda página de UserControl e tem um título seqüência que você pode usar

        <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/}" />

Em seguida, basta definir o estilo para o item selecionado na caixa de listagem

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top