我正在开发一个具有2种模式的应用程序
Boths模式将在新窗口中打开。我已经完成了配置窗口。
我需要通过按Key F12
或类似的东西在两种模式之间切换....我也必须提示用户输入密码,同时从执行切换到配置模式(只需一次durnig会话)我有制作了密码屏幕并在配置中实现。
我也很担心因为我使用了Messenger(Meaditor模式)所以关闭并打开2个不同的窗口会再次注册代表...我正在启动Modal windows
。
我们还需要让两个视图保持活动状态,否则我可以在切换时杀死其中一个视图。
完全混淆了实施......
我的App.Xaml代码
/// <summary>
/// Application_Startup
/// </summary>
/// <param name = "sender"></param>
/// <param name = "e"></param>
private void Application_Startup(object sender, StartupEventArgs e)
{
log.Debug("Application_Startup " + Utility.FUNCTION_ENTERED_LOG);
try
{
if (e.Args.Length == 0)
{
AboutDialog.SpashScreen(Utility.TOOL_NAME,
Utility.TOOL_VERSION);
MainView mainForm = new MainView();
mainForm.ShowDialog();
}
else
{
string key = null;
foreach (string arg in e.Args)
{
if (arg.StartsWith("-"))
{
//this is a key
key = arg;
if (key.Equals("-config"))
{
CommandLineArgs.Add(key, "config");
break;
}
if (key.Equals("-start"))
{
CommandLineArgs.Add(key, "start");
}
}
else
{
//should be a value
if (key == null)
{
throw new Exception(
"The command line arguments are malformed.");
}
CommandLineArgs.Add(key, arg);
key = null;
}
}
string config = string.Empty;
foreach (object k in App.CommandLineArgs.Keys)
{
config += CommandLineArgs[k].ToString();
}
switch (config)
{
case "config":
AboutDialog.SpashScreen(
Utility.TOOL_NAME,
Utility.TOOL_VERSION);
MainView mainForm = new MainView();
mainForm.ShowDialog();
break;
case "start" :
ExecutionForm execuForm= new ExecutionForm();
execuForm.ShowDialog();
break;
default:
MessageBox.Show("Incorrect Parameters",
Utility.TOOL_NAME);
Application.Current.Shutdown();
break;
}
}
log.Debug("Application_Startup" + Utility.FUNCTION_EXIT_LOG);
}
catch (Exception ex)
{
log.Error("Application_Startup" + ex.Message, ex);
}
}
答案 0 :(得分:4)
你的实施对我来说并不是完全错误的。
如果我需要通过按键按下模态窗口上的两个视图之间的切换,那么我就会采用MVVM方式......
在窗口上有ContentControl
。将Content
绑定到DataContext
。
<DockPanel LastChildFill="true">
<Menu DockPanel.Dock="Top" ...>
</Menu>
<ContentControl Content="{Binding}" ... />
</DockPanel>
创建两个数据模板作为资源。一个数据模板对应于“配置”视图,而其他数据模板用于“执行”视图。
<Window.Resources>
<DataTemplate x:Key="ConfigView" ... />
<DataTemplate x:Key="ExecutionView" ... />
</Window.Resources>
您可以将这些数据模板保存在不同的资源文件中,并将资源字典合并到窗口资源中。
创建一个具有可写Mode
属性的ViewModel。实施INotifyPropertyChanged。
public class ViewModel : INotifPropertyChanged
{
private string mode;
public string Mode
{
get { return mode; }
set { mode = value; NotifPropertyChanged("Mode"); }
}
private IComamnd changeModeCommand;
public ICommand ChangeModeCommand
{
get
{
if (changeModeCommand == null)
changeModeCommand
= new DelegateCommand(
OnModeChange,
CanModeChange);
return changeModeCommand;
}
}
//// Other properties and functions go here ...
}
在上面的代码中,{。1}}内部找不到.Net API。从互联网上获取它们的实现。
在窗口上为DelegateCommand
注册KeyBinding
。 F12 F12
的{{1}}来自Command
。
KeyBinding
在.Net 4.0之前的版本中,ViewModel
属性不可绑定。请使用CommandReference。
<Window.InputBindings>
<KeyBinding Command="{Binding ChangeModeCommand}"
Key="F12" />
</Window.InputBindings>
键的OnModeChange(),从Command
类切换F12
并提升属性更改通知。
Mode
上的ViewModel
上有数据触发器。在数据触发器中,检查ContentControl
是否为“Config”,并将Window
更改为“Config”数据模板,将其更改为“Execution”datatemplate。
Mode
我希望在某种意义上我的方式可以帮助你。