我有一个类可以根据需要和意图正确处理WPF窗口之间的切换。但是我不禁想到必须有更好的方法来做到这一点。任何人都可以分享更好的解决方案吗?
这些是xaml代码的一部分,允许将参数传递给类方法。这些按钮是通过xaml资源文件中多个窗口使用的窗口模板加载的,因此无法从各个窗口访问它们。
xmlns:sw="cld-namespace:Project1.Behaviour"
<sw:ButtonHandlers x:Key="buttonAction"></sw:ButtonHandlers>
<Button x:Name="btnWin2" Content="CLICK ME" Style="{DynamicResource controlSet}" Command="{StaticResource buttonAction}" CommandParameter="window2"/>
还有一个ButtonHandlers类。如果窗口已隐藏在背景中,则会将其置于视图中,并隐藏当前窗口。如果尚未打开窗口,则会创建,打开该窗口的新实例,并隐藏当前窗口。原因是用户经常在窗口之间切换,并且需要保留每个窗口中的一些用户设置内容。
public class ButtonHandlers : ICommand
{
private Window newWin;
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
Window currWin = Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive);
bool winFound = false;
foreach (Window foundWindow in Application.Current.Windows)
{
if (foundWindow.Name.ToString().Equals(parameter.ToString()) && currWin.Name != foundWindow.Name)
{
foundWindow.Show();
currWin.Hide();
winFound = true;
break;
}
}
if (!winFound)
{
if (parameter.ToString() == "window1" && currWin.Name != "window1")
{
newWin = new window1 { Name = "window1", Title = "WINDOW 1" };
}
else if (parameter.ToString() == "window2" && currWin.Name != "window2")
{
newWin = new window2 { Name = "window2", Title = "WINDOW 2" };
}
else if (parameter.ToString() == "window3" && currWin.Name != "window3")
{
newWin = new window3 { Name = "window3", Title = "WINDOW 3" };
}
else if (parameter.ToString() == "MainWindow" && currWin.Name != "MainWindow" && currWin.Name != "window")
{
App.Current.MainWindow.Show();
currWin.Hide();
return;
}
else
{
return;
}
newWin.Show();
currWin.Hide();
}
}
}
下面是简化的Execute方法的示例,但是如果我只显示一个窗口而不先创建新实例并在以后需要时访问该实例,则以前隐藏的窗口的内容不会保留。有没有想法如何修改下面的方法而不使用如上所示的if else语句声明所有条件,以便保留每个窗口中的用户内容?
public void Execute(object parameter)
{
Window currWin = Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive);
Type t = Type.GetType("Project1." + parameter.ToString());
Window newWin = Activator.CreateInstance(t) as Window;
newWin.Show();
currWin.Hide();
}