Caliburn Micro:Screen.TryClose不起作用

时间:2014-07-18 17:29:03

标签: caliburn.micro showdialog

我沮丧地跑出了头发。

我做了一个稍微简单的例子,其中相同的viewmodel / view充当主窗口和对话框。希望这不会引起混淆。

class DialogViewModel : Screen
{
    private readonly IWindowManager _windowManager;

    public DialogViewModel(IWindowManager windowManager)
    {
        _windowManager = windowManager;
    }

    public void ShowDialog()
    {
        _windowManager.ShowDialog(new DialogViewModel(_windowManager));
    }

    //----------

    public DialogViewModel()
    {

    }

    public void Close()
    {
        TryClose();
        //TryClose(true);
        //TryClose(false);
    }
}

<Window x:Class="Views.DialogView"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
                xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro.Platform"
                mc:Ignorable="d" 
                d:DesignHeight="100" d:DesignWidth="200">
    <WrapPanel>
        <Button>
            Close
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <cal:ActionMessage MethodName="Close" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>
        <Button>
            Show Dialog
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <cal:ActionMessage MethodName="ShowDialog" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>
    </WrapPanel>
</Window>

public sealed class AppBootstrapper : BootstrapperBase
{
    private SimpleContainer _container;

    public AppBootstrapper() : base(true)
    {
        StartRuntime();
    }

    protected override void OnStartup(object sender, StartupEventArgs e)
    {
        DisplayRootViewFor<DialogViewModel>();
    }

    protected override void Configure()
    {
        _container = new SimpleContainer();
        _container.Singleton<IWindowManager, WindowManager>();
        _container.Singleton<IEventAggregator, EventAggregator>();

        _container.PerRequest<DialogViewModel>();
    }

    protected override object GetInstance(Type service, string key)
    {
        var instance = _container.GetInstance(service, key);
        if (instance != null)
            return instance;
        throw new InvalidOperationException("Could not locate any instances.");
    }

    protected override IEnumerable<object> GetAllInstances(Type service)
    {
        return _container.GetAllInstances(service);
    }

    protected override void BuildUp(object instance)
    {
        _container.BuildUp(instance);
    }
}

调用TryClose()不会启动OnDeactivate。 根据{{​​3}}和stackoverflow上的几个帖子,上面应该足够了。但是当我调用TryClose()时没有任何反应。

请注意代码确实运行并在我的机器上显示对话框。如果遗漏了什么,请告诉我。

任何想法为什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

StartRuntime应该是Initialize(),codeplex代码真的已经过时了v2的发布。参考github.com/bluespire/Caliburn.Micro或CaliburnMicro.com。我假设这是一个WPF应用程序。你的按钮也不正确。

<Button x:Name="ShowDialog" Content="ShowDialog" />
<Button x:Name="Close" Content="Close" />

我假设这是一个WPF应用程序。