【问题标题】:WPF: Navigation/Design: How to keep track of state so I can change appearance of buttons?WPF:导航/设计:如何跟踪状态以便更改按钮的外观?
【发布时间】:2011-03-24 12:14:51
【问题描述】:

我有一个具有顶级导航菜单的应用程序,该菜单由堆栈面板中的一系列按钮组成。当用户单击按钮时,视图模型会处理命令并更新 CurrentView(类型 UserControl)的值。 CurrentView 绑定到元素 ContentControl,如下所示。

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

我希望“菜单”跟踪用户的位置,以便我可以更改导航按钮的前景,以便用户知道他们在哪里。做这个的最好方式是什么?我应该将此“菜单”包装到控件中吗?

传递给 ContentControl 的某些视图将有自己的子菜单。这些子菜单的工作方式相同,我想更改这些子菜单的前景和背景。

【问题讨论】:

    标签: wpf mvvm mvvm-light


    【解决方案1】:

    您在这里谈论的大部分内容通常是通过使用框架和带有内容页面的导航来完成的。您不使用它是否有特定原因?

    例如:

    <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);
        }
    

    如果您不想使用页面并想使用控件,您可以这样做,但您必须手动提供跟踪。我建议您使用仅用于导航的视图模型,它可以保留一些数据本身。

    【讨论】:

    • 使用框架而不是 ContentControl 可能是要走的路。我没有理由不能将这些控件变成页面。我不确定我为什么要使用控件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2020-04-03
    相关资源
    最近更新 更多