WPF Style Active Item - PullRequest
       10

WPF Style Active Item

0 голосов
/ 28 марта 2009

Я пытаюсь создать повторно используемый стиль навигации Пользовательский элемент управления в WPF, как панель навигации на веб-сайте. Он будет содержать ссылки на все основные страницы моего приложения. Этот элемент управления может идти поверх всех моих страниц в моем NavigationWindow. Придание красивого согласованного внешнего вида страницам, например веб-сайту.

Моя проблема заключается в том, чтобы оформить ссылку на текущую страницу иначе, чем ссылки на других страницах, чтобы вы могли быстро взглянуть на нее и увидеть, на какой странице вы находитесь. Поскольку элемент управления на каждой странице одинаков, мне нужно сообщить ему, какая страница является «активной», и назначить ей соответствующий стиль.

Моей первой мыслью было просто поместить Is 1007 * Активные свойства в элемент управления, по одному для каждой страницы, а затем установить для свойства соответствующее значение true на странице. (Или я мог бы использовать одно свойство, которое принимает значение Enum вместо множества свойств, в любом случае)

Пример:

<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>

После всего этого фона вот мой вопрос. Это работает, но мне нужно будет продублировать этот DataTrigger и все сеттеры в нем для каждой страницы, которую я имею, потому что триггер должен напрямую ссылаться на свойство IsHomePageActive, которое применяется только к одной ссылке. Поэтому мне нужен свой стиль для каждой ссылки, даже если фактический стиль, который он описывает, абсолютно одинаков (то есть, я имею в виду, что сеттеры одинаковы). Разница лишь в том, какое свойство отслеживает триггер.

Есть ли какой-нибудь способ сделать это (или что-то с тем же конечным результатом), не заканчивая сотнями строк дублированного XAML?

1 Ответ

1 голос
/ 28 марта 2009

Как насчет использования шаблона master / detail () со списком (скажем) в качестве мастера и ваших страниц в качестве деталей.

Затем укажите свой стиль для выбранного элемента в списке.

Страница изменится при выборе другого элемента списка и будет отличаться от других элементов.

если у вас есть свойство зависимости, такое как List Pages, где Page наследует от UserControl и имеет строку Title, которую вы можете использовать

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

Затем просто установите стиль для выбранного элемента в списке

...