Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF Prism中的登录窗口_Wpf_Mvvm_Login_Prism - Fatal编程技术网

WPF Prism中的登录窗口

WPF Prism中的登录窗口,wpf,mvvm,login,prism,Wpf,Mvvm,Login,Prism,在shell运行之前,我正在实现一个登录窗口。我将如何运行代码,并在登录窗口中进行身份验证后,继续执行shell应用程序 这是我的初始代码: LoginViewModel.cs public event EventHandler LoginCompleted; private void RaiseLoginCompletedEvent() { LoginCompleted?.Invoke(this, EventArgs.Empty); } 从Shell启

在shell运行之前,我正在实现一个登录窗口。我将如何运行代码,并在登录窗口中进行身份验证后,继续执行shell应用程序

这是我的初始代码:

LoginViewModel.cs

public event EventHandler LoginCompleted;
    private void RaiseLoginCompletedEvent()
    {
        LoginCompleted?.Invoke(this, EventArgs.Empty);
    }
从Shell启动Bootstraper.cs

这里的问题是,我无法实例化我的LoginModel,因为我的模型的构造函数有一个参数来使用我的服务接口


有什么解决办法吗?谢谢

新建一个类的实例,该类自己实现
ILoginAuth
接口:

var loginVM = new LoginViewModel(new LoginAuth());
…或者让容器为您执行以下操作:

var loginVM = new LoginViewModel(Container.Resolve<ILoginAuth>());

另一种方法是:

ILoginAuth auth = CommonServiceLocator.ServiceLocator.Current.GetInstance<ILoginAuth>();
ILoginAuth auth=CommonServiceLocator.ServiceLocator.Current.GetInstance();
这样,您就不必在构造函数中包含
ILoginAuth
。而且,你可以在任何地方做这件事


    <pre>
    /*Brian code modified */
    
    public interface ICloseWindow {
      Action Close {
        get;
        set;
      }
    }
    
    public partial class LoginWindow: Window {
      public LoginWindow(ILoginViewModel viewModel) {
        InitializeComponent();
    
        DataContext = viewModel;
    
        Loaded += MainWindow_Loaded;
      }
    
      private void MainWindow_Loaded(object sender, RoutedEventArgs e) {
        if (DataContext is ICloseWindow vm) {
          vm.Close += () =>{
            DialogResult = true;
          };
        }
      }
    
      private void Close_Window(object sender, RoutedEventArgs e) {
        DialogResult = false;
      }
    }
    
    /*App.xaml.cs*/
    protected override void InitializeShell(Window shell) {
      Window login = Container.Resolve < LoginWindow > ();
    
      var result = login.ShowDialog();
    
      if (!result.Value) {
        Application.Current.Shutdown();
      }
      else {
        base.InitializeShell(shell);
      }
    }
    
    public class LoginViewModel: BindableBase,
    ILoginViewModel,
    ICloseWindow {
      private string _userName;
    
      private string _password;
    
      private bool _isAuthenticated;
    
      private ICommand _authenticateUserCommand;
    
      private IEventAggregator _eventAggregator;
    
      public Action Close {
        get;
        set;
      }
    
      public ICommand AuthenticateUserCommand {
        get =>_authenticateUserCommand;
        set =>_authenticateUserCommand = value;
      }
    
      public LoginViewModel(IEventAggregator eventAggregator) {
        AuthenticateUserCommand = new DelegateCommand < object > (AuthenticateUser);
    
        _eventAggregator = eventAggregator;
      }
    
      private void AuthenticateUser(object parameter) {
        var passwordBox = parameter as PasswordBox;
    
        var password = passwordBox.Password;
    
        if (password == "password") {
          _isAuthenticated = true;
    
          _eventAggregator.GetEvent < MessageSentEvent > ().Publish("Login Data");
        }
    
        if (_isAuthenticated) {
          Close ? .Invoke();
        }
      }
    
      public string UserName {
        get =>_userName;
        set =>_userName = value;
      }
    
      public string Password {
        get {
          return _password;
        }
        set {
          if (_password != value) {
    
            _password = value;
    
            RaisePropertyChanged(nameof(Password));
    
          }
        }
      }
    }

<Window x:Class="YourApplication.Views.LoginWindow"
        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:YourApplication"
        mc:Ignorable="d"
        Title="LoginWindow"
        Height="450"
        Width="800"
        WindowStartupLocation="CenterScreen"
        WindowStyle="None"
        x:Name="WindowBorder"
        RenderOptions.BitmapScalingMode="HighQuality">
    <Grid SnapsToDevicePixels="True"
          UseLayoutRounding="True"
          TextOptions.TextFormattingMode="Display"
          TextOptions.TextRenderingMode="ClearType">
        <DockPanel>
            <DockPanel DockPanel.Dock="Left"
                       Width="400"
                       LastChildFill="True">
                <Canvas>
                    <Canvas.Background>
                        <ImageBrush ImageSource="pack://application:,,,/YourApplication;component/Images/Splash.png" />
                    </Canvas.Background>
                    <TextBlock Margin="4,0,0,4"
                               VerticalAlignment="Center"
                               Foreground="#FFAAAAAA"
                               TextWrapping="NoWrap"
                               Text="Library Management System"
                               FontSize="16"
                               Background="Transparent"
                               DockPanel.Dock="Top" />
                </Canvas>
            </DockPanel>
            <DockPanel LastChildFill="True">
                <Button x:Name="PART_CLOSE"
                        DockPanel.Dock="Top"
                        HorizontalAlignment="Right"
                        VerticalAlignment="Center"
                        Margin="5"
                        Height="20"
                        Width="20"
                        Style="{DynamicResource MetroWindowButtonStyle}"
                        Click="Close_Window">
                    <Path Data="F1M54.0573,47.8776L38.1771,31.9974 54.0547,16.1198C55.7604,14.4141 55.7604,11.6511 54.0573,9.94531 52.3516,8.23962 49.5859,8.23962 47.8802,9.94531L32.0026,25.8229 16.1224,9.94531C14.4167,8.23962 11.6511,8.23962 9.94794,9.94531 8.24219,11.6511 8.24219,14.4141 9.94794,16.1198L25.8255,32 9.94794,47.8776C8.24219,49.5834 8.24219,52.3477 9.94794,54.0534 11.6511,55.7572 14.4167,55.7585 16.1224,54.0534L32.0026,38.1745 47.8802,54.0534C49.5859,55.7585 52.3516,55.7572 54.0573,54.0534 55.7604,52.3477 55.763,49.5834 54.0573,47.8776z"
                          Stretch="Uniform"
                          Fill="#FFAAAAAA"
                          Width="10"
                          Margin="0,0,0,0"></Path>
                </Button>
                <StackPanel>
                    <PasswordBox x:Name="txtPassword"
                                 Margin="2,20,10,10"
                                 Height="22"
                                 Width="100" />
                    <Button Width="100"
                            Height="22"
                            Margin="10,150,10,10"
                            Content="Login"
                            Command="{Binding AuthenticateUserCommand}"
                            CommandParameter="{Binding ElementName=txtPassword}" />
                </StackPanel>
            </DockPanel>
        </DockPanel>
    </Grid>
</Window>

    </pre>
/*布赖恩代码修改*/ 公共界面关闭窗口{ 行动结束{ 得到; 设置 } } 公共部分类登录窗口:窗口{ 公共登录窗口(ILoginViewModel viewModel){ 初始化组件(); DataContext=viewModel; 加载+=主窗口\u加载; } 已加载私有void主窗口(对象发送器、路由目标){ 如果(DataContext是ICloseWindow vm){ vm.Close+=()=>{ DialogResult=true; }; } } 私有无效关闭窗口(对象发送方,路由目标e){ DialogResult=false; } } /*App.xaml.cs*/ 受保护的覆盖无效初始值设置shell(窗口外壳){ windowlogin=Container.Resolve(); var result=login.ShowDialog(); 如果(!result.Value){ Application.Current.Shutdown(); } 否则{ 基础。初始值设定为shell(外壳); } } 公共类LoginViewModel:BindableBase, ILoginViewModel, ICloseWindow{ 私有字符串\u用户名; 私有字符串\u密码; 私人住宅已通过认证; 专用ICommand_authenticateUserCommand; 私人事件聚合器; 公众行动结束{ 得到; 设置 } 公共ICommand AuthenticateUserCommand{ get=>\u authenticateUserCommand; set=>\u authenticateUserCommand=value; } 公共登录查看模型(IEventAggregator事件聚合器){ AuthenticateUserCommand=newdelegateCommand(AuthenticateUser); _eventAggregator=eventAggregator; } 私有void AuthenticateUser(对象参数){ var passwordBox=参数作为passwordBox; var password=passwordBox.password; 如果(密码==“密码”){ _isAuthenticated=true; _eventAggregator.GetEvent().Publish(“登录数据”); } 如果(_已验证){ 关闭?.Invoke(); } } 公共字符串用户名{ 获取=>\u用户名; set=>_userName=value; } 公共字符串密码{ 得到{ 返回密码; } 设置{ 如果(_password!=值){ _密码=值; RaisePropertyChanged(名称(密码)); } } } }
    <pre>
    /*Brian code modified */
    
    public interface ICloseWindow {
      Action Close {
        get;
        set;
      }
    }
    
    public partial class LoginWindow: Window {
      public LoginWindow(ILoginViewModel viewModel) {
        InitializeComponent();
    
        DataContext = viewModel;
    
        Loaded += MainWindow_Loaded;
      }
    
      private void MainWindow_Loaded(object sender, RoutedEventArgs e) {
        if (DataContext is ICloseWindow vm) {
          vm.Close += () =>{
            DialogResult = true;
          };
        }
      }
    
      private void Close_Window(object sender, RoutedEventArgs e) {
        DialogResult = false;
      }
    }
    
    /*App.xaml.cs*/
    protected override void InitializeShell(Window shell) {
      Window login = Container.Resolve < LoginWindow > ();
    
      var result = login.ShowDialog();
    
      if (!result.Value) {
        Application.Current.Shutdown();
      }
      else {
        base.InitializeShell(shell);
      }
    }
    
    public class LoginViewModel: BindableBase,
    ILoginViewModel,
    ICloseWindow {
      private string _userName;
    
      private string _password;
    
      private bool _isAuthenticated;
    
      private ICommand _authenticateUserCommand;
    
      private IEventAggregator _eventAggregator;
    
      public Action Close {
        get;
        set;
      }
    
      public ICommand AuthenticateUserCommand {
        get =>_authenticateUserCommand;
        set =>_authenticateUserCommand = value;
      }
    
      public LoginViewModel(IEventAggregator eventAggregator) {
        AuthenticateUserCommand = new DelegateCommand < object > (AuthenticateUser);
    
        _eventAggregator = eventAggregator;
      }
    
      private void AuthenticateUser(object parameter) {
        var passwordBox = parameter as PasswordBox;
    
        var password = passwordBox.Password;
    
        if (password == "password") {
          _isAuthenticated = true;
    
          _eventAggregator.GetEvent < MessageSentEvent > ().Publish("Login Data");
        }
    
        if (_isAuthenticated) {
          Close ? .Invoke();
        }
      }
    
      public string UserName {
        get =>_userName;
        set =>_userName = value;
      }
    
      public string Password {
        get {
          return _password;
        }
        set {
          if (_password != value) {
    
            _password = value;
    
            RaisePropertyChanged(nameof(Password));
    
          }
        }
      }
    }

<Window x:Class="YourApplication.Views.LoginWindow"
        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:YourApplication"
        mc:Ignorable="d"
        Title="LoginWindow"
        Height="450"
        Width="800"
        WindowStartupLocation="CenterScreen"
        WindowStyle="None"
        x:Name="WindowBorder"
        RenderOptions.BitmapScalingMode="HighQuality">
    <Grid SnapsToDevicePixels="True"
          UseLayoutRounding="True"
          TextOptions.TextFormattingMode="Display"
          TextOptions.TextRenderingMode="ClearType">
        <DockPanel>
            <DockPanel DockPanel.Dock="Left"
                       Width="400"
                       LastChildFill="True">
                <Canvas>
                    <Canvas.Background>
                        <ImageBrush ImageSource="pack://application:,,,/YourApplication;component/Images/Splash.png" />
                    </Canvas.Background>
                    <TextBlock Margin="4,0,0,4"
                               VerticalAlignment="Center"
                               Foreground="#FFAAAAAA"
                               TextWrapping="NoWrap"
                               Text="Library Management System"
                               FontSize="16"
                               Background="Transparent"
                               DockPanel.Dock="Top" />
                </Canvas>
            </DockPanel>
            <DockPanel LastChildFill="True">
                <Button x:Name="PART_CLOSE"
                        DockPanel.Dock="Top"
                        HorizontalAlignment="Right"
                        VerticalAlignment="Center"
                        Margin="5"
                        Height="20"
                        Width="20"
                        Style="{DynamicResource MetroWindowButtonStyle}"
                        Click="Close_Window">
                    <Path Data="F1M54.0573,47.8776L38.1771,31.9974 54.0547,16.1198C55.7604,14.4141 55.7604,11.6511 54.0573,9.94531 52.3516,8.23962 49.5859,8.23962 47.8802,9.94531L32.0026,25.8229 16.1224,9.94531C14.4167,8.23962 11.6511,8.23962 9.94794,9.94531 8.24219,11.6511 8.24219,14.4141 9.94794,16.1198L25.8255,32 9.94794,47.8776C8.24219,49.5834 8.24219,52.3477 9.94794,54.0534 11.6511,55.7572 14.4167,55.7585 16.1224,54.0534L32.0026,38.1745 47.8802,54.0534C49.5859,55.7585 52.3516,55.7572 54.0573,54.0534 55.7604,52.3477 55.763,49.5834 54.0573,47.8776z"
                          Stretch="Uniform"
                          Fill="#FFAAAAAA"
                          Width="10"
                          Margin="0,0,0,0"></Path>
                </Button>
                <StackPanel>
                    <PasswordBox x:Name="txtPassword"
                                 Margin="2,20,10,10"
                                 Height="22"
                                 Width="100" />
                    <Button Width="100"
                            Height="22"
                            Margin="10,150,10,10"
                            Content="Login"
                            Command="{Binding AuthenticateUserCommand}"
                            CommandParameter="{Binding ElementName=txtPassword}" />
                </StackPanel>
            </DockPanel>
        </DockPanel>
    </Grid>
</Window>

    </pre>