Я обновил свое приложение до MahApps.Metro, но получаю очень непонятную ошибку.Вот мой код:
public partial class Login : MetroWindow
{
public bool AllowAutomaticLogin { get; set; }
public Login()
{
InitializeComponent();
Loaded += OnLoaded;
AllowAutomaticLogin = true;
}
public Login(bool allowAutomaticLogin)
{
InitializeComponent();
Loaded += OnLoaded;
AllowAutomaticLogin = allowAutomaticLogin;
}
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
DataContext = new LoginViewModel(CloseWindow, AllowAutomaticLogin);
}
private void CloseWindow(object obj)
{
GetWindow(this).Close();
}
...other stuff that doesn't matter
}
В моей модели представления у меня есть конструктор:
public LoginViewModel(Action<object> closeWindow, bool allowAutomaticLogin)
{
AllowAutomaticLogin = allowAutomaticLogin;
CloseWindow = closeWindow;
Login = new RelayCommand(_Login);
SwitchAccounts = new RelayCommand(_SwitchAccounts);
if (AllowAutomaticLogin)
{
try
{
AttendanceAppServiceClient proxy = new AttendanceAppServiceClient();
if (proxy.IsRegistered(Environment.UserName))
{
Username = Environment.UserName;
IsRecognized = true;
RecognizedText = "You have been recognized as " + Username + ". Please provide your password.";
if (Properties.Settings.Default.AutomaticLogin)
{
var user = proxy.GetUser(Username);
var mainWindow = new MainWindow(user);
mainWindow.Show();
CloseWindow(null);
}
}
else
{
IsRecognized = false;
}
proxy.Close();
}
catch (Exception ex)
{
}
}
}
Дело в том, соответствует ли имя пользователя ПК действительному имени пользователя в базе данных и еслинастройка приложения позволяет это, он просто регистрирует их (просто закрывает окно входа и открывает главное окно).Теперь, если в настройках указано значение false, вы можете просто войти в систему как обычно и ввести имя пользователя и пароль следующим образом
private void _Login(object obj)
{
try
{
AttendanceAppServiceClient proxy = new AttendanceAppServiceClient();
User user;
if ((user = proxy.IsValidUser(Username, SecurePassword)) != null)
{
var mainWindow = new MainWindow(user);
mainWindow.Show();
CloseWindow(null);
}
else
{
MessageBox.Show("Invalid credentials. Try again.");
}
proxy.Close();
}
catch (Exception ex)
{
}
}
В основном этот фрагмент кода:
var mainWindow = new MainWindow(user);
mainWindow.Show();
CloseWindow(null);
- это простотак же.Но если я позволю настройке AllowAutomaticLogin в конструкторе представления true, это даст мне
System.ArgumentNullException: Value cannot be null. Parameter name: window
, но если я установлю значение false и войдите в систему как обычно, in проходит через метод _Login, закрывает и открывает новое окно должным образом,Трассировка стека:
at System.Windows.Interop.WindowInteropHelper..ctor(Window window)
at ControlzEx.Behaviors.WindowChromeBehavior.AssociatedObject_SourceInitialized(Object sender, EventArgs e) in C:\projects\controlzex\src\ControlzEx\Behaviors\WindowChromeBehavior.cs:line 323
at System.EventHandler.Invoke(Object sender, EventArgs e)
at System.Windows.Window.OnSourceInitialized(EventArgs e)
at System.Windows.Window.CreateSourceWindow(Boolean duringShow)
at System.Windows.Window.CreateSourceWindowDuringShow()
at System.Windows.Window.SafeCreateWindowDuringShow()
at System.Windows.Window.ShowHelper(Object booleanBox)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.DispatcherOperation.InvokeImpl()
at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
at System.Windows.Threading.DispatcherOperation.Invoke()
at System.Windows.Threading.Dispatcher.ProcessQueue()
at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run(Window window)
at System.Windows.Application.Run()
at AttendanceApp.App.Main()
Просто чтобы прояснить ситуацию, он прекрасно работал до того, как я добавил MetroWindow (все, что я сделал, это изменил базовый класс на MetroWindow и добавил элементы управления: MetroWindow вместо Window).В чем может быть проблема.