我在WPF
应用程序中使用Caliburn.Micro
和Modern-UI
。在modern-ui框架(这是一个UserControl
)内的“页面”上,我试图使用Conductor
来切换当前视图。以下是我到目前为止有:为什么Caliburn.Micro(用于modern-ui)OnActivate在ActivateItem之后没有被调用?
注:命名空间从源代码删除为简洁现代的UI窗口
<UserControl x:Class="ShellView">
<ContentControl x:Name="ActiveItem" />
</UserControl>
来源为内部
XAML的 “页面” ShellViewModel(指挥)
[Export]
public class ShellViewModel : Conductor<IScreen>.Collection.OneActive
{
private readonly Test1ViewModel m_TestView1;
private readonly Test2ViewModel m_TestView2;
public ShellViewModel()
{
this.m_TestView1 = new Test1ViewModel();
this.m_TestView2 = new Test2ViewModel();
this.ActivateItem(this.m_TestView1);
}
}
Test1View的XAML现在没有任何内容,只是普通的UserControl内容。
来源为Test1ViewModel
public class Test1ViewModel : Screen
{
protected override void OnActivate()
{
//This DOES NOT show or fire, I even put a breakpoint to double check
Debug.Print("This should show in output");
}
}
时ActivateItem
被调用,OnActivate
不火的。我甚至尝试在导体上的查看模型Test1ViewModel
上拨打ConductWith(this)
,但那不起作用。我正在使用Modern-UI
这可能很重要,因为这个相同的东西在不使用Modern-UI
的不同项目中工作。哦,当调用ActivateItem
时,屏幕上会显示相应的视图(我添加了一些验证视图确实会改变的按钮)。
任何想法,为什么UserControl
将在ContentControl
显示主叫ActivateItem
但OnActivate
不火的毕竟?
还有一件事......这也可能与它有关,但如果它确实存在,我不知道为什么或如何解决它。我正在使用这个课程,使视图Modern-UI
与Caliburn.Micro
的模型第一种方法一起工作良好。
internal class ModernContentLoader : DefaultContentLoader
{
protected override object LoadContent(Uri uri)
{
object content = base.LoadContent(uri);
if (content == null)
return null;
// Locate the right viewmodel for this view
object vm = ViewModelLocator.LocateForView(content);
if (vm == null)
return content;
// Bind it up with CM magic
if (content is DependencyObject)
ViewModelBinder.Bind(vm, content as DependencyObject, null);
return content;
}
}
我有一个类似的问题。我需要通过从对象引用调用ActivateItem来切换视图。 示例: 让我们假设一个选项卡式界面,其中viewmodel aaa当前处于活动状态,viewmodel ccc处于禁用状态。 以下代码被写入视图模型AAA的方法内: 'ViewModelB BBB =新ViewModelB();'' ccc.ActivateItem(BBB);' 但是,如果我切换回CCC其中BBB不loadedd。我怎样才能克服这个问题? – Rahul 2015-10-30 07:17:26
@Rahul虽然看起来很相似,但我认为你的问题与我原来的问题完全不同。我建议创建一个新问题,以便更好地描述您的问题并提供更深入的代码示例。 – vane 2016-04-01 23:41:54
非常感谢@vane - 并感谢您为我调试 - 您的解决方案绝对是现货,我有同样的问题,因为没有明显的原因我的项目没有激活(OnActivated事件),事实证明,确切地说,父母,导体没有被激活,只要我放置一个衬垫'ScreenExtensions.TryActivate(this);'一切正常(正常情况下)。我不确定是否需要'停用'(就像你提到的那样),因为我不'真的需要这样做。再次感谢人! – NSGaga 2016-07-29 20:45:15