WPF: Навигация / Дизайн: Как отслеживать состояние, чтобы я мог изменить внешний вид кнопок? - PullRequest
0 голосов
/ 03 августа 2010

У меня есть приложение, которое имеет меню навигации верхнего уровня, которое состоит из серии кнопок в панели стека. Когда пользователь нажимает кнопку, модель представления обрабатывает команду и обновляет значение CurrentView (тип UserControl). CurrentView привязан к элементу ContentControl, как показано ниже.

<ContentControl Content="{Binding CurrentView}" />

Я хочу, чтобы «меню» отслеживало, где находится пользователь, чтобы я мог изменить передний план кнопок навигации, чтобы пользователи знали, где они находятся. Каков наилучший способ сделать это? Должен ли я обернуть это «меню» в элемент управления?

Некоторые из представлений, передаваемых в ContentControl, будут иметь свои собственные подменю. Эти подменю работают одинаково, и я хотел бы изменить для них передний план и фон.

1 Ответ

1 голос
/ 04 августа 2010

Большая часть того, о чем вы здесь говорите, обычно делается с помощью фрейма и навигации по страницам контента. Есть ли конкретная причина, по которой вы этим не пользуетесь?

Например:

<sdk:Frame x:Name="CenterFrame" BorderThickness="0" Source="/Home">
<sdk:Frame.UriMapper>
    <sdk:UriMapper>
        <sdk:UriMapping Uri="/Job/{ID}" MappedUri="/Views/JobView.xaml?ID={ID}"/>
        <sdk:UriMapping Uri="/Home" MappedUri="/Views/HomeView.xaml"/>
        <sdk:UriMapping Uri="/Resource/{ResourceName}" MappedUri="/Views/ResourceView.xaml?Resource={ResourceName}"/>
        <sdk:UriMapping Uri="/Tasks" MappedUri="/Views/TaskView.xaml"/>
    </sdk:UriMapper>
</sdk:Frame.UriMapper>

А потом на вашей странице:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        if (this.NavigationContext.QueryString.ContainsKey("Resource"))
        {
            ResourceViewModel rvm = ViewModelLocator.ResourceVMStatic;
            if (rvm != null)
                rvm.ResourceName = this.NavigationContext.QueryString["Resource"];
        }
        base.OnNavigatedTo(e);
    }

Если вы не хотите использовать страницы и хотите использовать элементы управления, вы можете сделать это, но вам придется обеспечить отслеживание вручную. Я бы порекомендовал использовать модель представления только для вашей навигации, которая может сохранять некоторые данные.

...