在WPF中导航视图

时间:2015-12-17 16:21:28

标签: c# wpf

我是WPF的新手,刚刚投入了一个项目。已经存在一个LoginWindow,并且当前有一个忘记密码按钮,它会打开一个新的对话窗口。经理想要改变使用相同的窗口,而不是在它上面打开一个新窗口。我还没有看到如何实现这一目标的真实例子,因为在WPF中似乎有很多不同的方法可以做。我最初的可能是使用一个像div一样的面板并显示并隐藏在同一个窗口中,就像我在HTML中的DIV但不确定。

某人已经建立的当前登录信息如下:

<Controls:MetroWindow  x:Class="Omega.LoginView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:properties="clr-namespace:Omega.Properties"
        xmlns:tools="clr-namespace:Omega.modules.Features"
        xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
        Title="USER LOGIN" Icon="resources/icons/OmegaApp.ico"
        TextOptions.TextFormattingMode="Display"
        ShowInTaskbar="True" Topmost="False"
        WindowStartupLocation="CenterScreen" ResizeMode="NoResize"
        GlowBrush="{DynamicResource AccentColorBrush}"   BorderThickness="1" EnableDWMDropShadow="True"  WindowTransitionsEnabled="False" Closed="LoginWindow_Close" Height="446" Width="808" Visibility="Visible">
    <Controls:MetroWindow.Background>
        <ImageBrush ImageSource="resources\images\Omega-BGScreen.jpg"/>
    </Controls:MetroWindow.Background>
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/resources/Resource_Dictionary.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/FlatButton.xaml" />
                <ResourceDictionary Source="/resources/Icons.xaml" />
            </ResourceDictionary.MergedDictionaries>

            <x:Array x:Key="WindowCommandsOverlayBehaviorArray"
                     Type="Controls:WindowCommandsOverlayBehavior">
                <Controls:WindowCommandsOverlayBehavior>Always</Controls:WindowCommandsOverlayBehavior>
                <Controls:WindowCommandsOverlayBehavior>Flyouts</Controls:WindowCommandsOverlayBehavior>
                <Controls:WindowCommandsOverlayBehavior>HiddenTitleBar</Controls:WindowCommandsOverlayBehavior>
                <Controls:WindowCommandsOverlayBehavior>Never</Controls:WindowCommandsOverlayBehavior>
            </x:Array>

        </ResourceDictionary>
    </Window.Resources>

    <Grid >
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Image Grid.ColumnSpan="3"  Source="resources/images/Omega_Logo.png" HorizontalAlignment="Left" Height="100" Margin="58,48,0,0" VerticalAlignment="Top" Width="186" Grid.RowSpan="2"/>
        <TextBox Name="UserID_Text" Grid.ColumnSpan="2" Grid.Column="2" HorizontalAlignment="Left" Height="30" Grid.Row="2" TextWrapping="Wrap" Text="Omega" VerticalAlignment="Top" Width="190" VerticalContentAlignment="Center" Margin="0,30,0,0" TabIndex="0" IsTabStop="True"/>
        <Button Style="{StaticResource StandardButton}"  Content="{x:Static properties:Resources.Login_Label}"  IsDefault="True" HorizontalAlignment="Left" Grid.Row="3" VerticalAlignment="Top" Width="400" Grid.ColumnSpan="4" Height="30" Grid.Column="2" Click="Login_Button_Click" TabIndex="2" />
        <TextBox HorizontalAlignment="Left" Height="23" Margin="0,33,0,0" Grid.Row="5" TextWrapping="Wrap" Text="v 2.0" VerticalAlignment="Top" Width="52" RenderTransformOrigin="0.392,0.346" BorderThickness="0" Foreground="LightGray" Focusable="False"/>
        <PasswordBox Name="Pass_Text" Password="nopassword" Grid.Column="4" HorizontalAlignment="Left" Margin="10,30,0,0" Grid.Row="2" VerticalAlignment="Top" Height="30" Grid.ColumnSpan="2" Width="190" VerticalContentAlignment="Center" TabIndex="1"/>
        <Label Content="User Login" Grid.Column="2" HorizontalAlignment="Left" Grid.Row="2" VerticalAlignment="Top" Width="100"/>
        <Button Style="{StaticResource LinkButton}" Content="{x:Static properties:Resources.ForgotPass_label}" Grid.Column="2" HorizontalAlignment="Left" Grid.Row="3" VerticalAlignment="Top" Click="ForgotPassword_Click" Width="Auto" Grid.ColumnSpan="2" Margin="0,35,0,0" Focusable="False"/>
        <TextBlock Grid.Column="3" HorizontalAlignment="Left" Margin="18,36,0,0" Grid.Row="3" TextWrapping="Wrap"  Text="  |   " VerticalAlignment="Top" Width="Auto" Height="17" RenderTransformOrigin="2,0.529"/>
        <Button Style="{StaticResource LinkButton}" Content="{x:Static properties:Resources.Help_label}" Grid.Column="3" HorizontalAlignment="Left" Margin="36,36,0,0" Grid.Row="3" VerticalAlignment="Top" Width="34" Height="17" Click="Help_Click" RenderTransformOrigin="0.559,1.824" Focusable="False"/>
    </Grid>

</Controls:MetroWindow>

1 个答案:

答案 0 :(得分:1)

对不起,这是一个粗略的例子,但我希望它能告诉你如何解决你的问题。下面是一个关于如何使用按钮交换两个用户控件的简单示例...

你有一个shell视图:

sudo service mongod restart

绑定到这样的视图模型:

<Window x:Class="LogonApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:LogonApplication"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <DataTemplate DataType="{x:Type local:ChangePasswordViewModel}">
            <local:ChangePasswordView />
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:EnterPasswordViewModel}">
            <local:EnterPasswordView />
        </DataTemplate>
    </Window.Resources>

    <DockPanel LastChildFill="False">
        <ContentPresenter Content="{Binding ActiveView}"
                          DockPanel.Dock="Top"/>
        <StackPanel DockPanel.Dock="Bottom">
            <Button Content="Change View" Command="{Binding ChangeViewCommand}"/>
        </StackPanel>
    </DockPanel>
</Window>

然后,您需要做的就是更改内容演示者显示的视图模型。这可以通过连接命令来切换用户控件/视图模型来实现。

    public class MainWindowViewModel : ViewModelBase
    {
        ViewModelBase _activeView;

        public MainWindowViewModel()
        {
            _activeView = new EnterPasswordViewModel();
            ChangeViewCommand = new ChangeViewCommand(this);
        }

        public ViewModelBase ActiveView
        {
            get { return _activeView; }

            set
            {
                _activeView = value;
                OnPropertyChanged("ActiveView");
            }
        }

        public ICommand ChangeViewCommand { get; set; }
    }

以下是完整性的基类:

class ChangeViewCommand : ICommand
{
    private MainWindowViewModel _mainWindowViewModel;

    public event EventHandler CanExecuteChanged;

    public ChangeViewCommand(MainWindowViewModel mainWindowViewModel)
    {
        _mainWindowViewModel = mainWindowViewModel;
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        if (_mainWindowViewModel.ActiveView.GetType() == typeof(EnterPasswordViewModel))
        {
            _mainWindowViewModel.ActiveView = new ChangePasswordViewModel();
        }
        else
        {
            _mainWindowViewModel.ActiveView = new EnterPasswordViewModel();
        }
    }
}

我没有显示其他两个视图和视图模型,但视图只是WPF用户控件,视图模型是实现viewmodelbase的类。如果您需要更多信息,请与我们联系。

相关问题