如何使用Caliburn.Micro 2自定义窗口?

时间:2015-01-18 03:18:43

标签: c# wpf mvvm caliburn.micro

我想使用我自己的扩展 Window 的类来使用Caliburn.Micro在MVVM环境中显示对话框。

我已经阅读了如何通过覆盖 WindowManager 中的 EnsureWindow 方法或通过访问默认的 WindowManager来自定义CM提供的窗口我的视图模型中的实例,并将设置字典传递给“ShowDialog”方法。然而,我真正需要的是使用我自己的类,因为它包含其他元素,只是通过设置一些属性就无法提供给默认窗口。

为清楚起见,我可以使用默认的 Window 类作为我的根视图。

这有可能吗?如果某种方式我的问题没有意义,我会很高兴扩展我的理由......

先感谢社区!

1 个答案:

答案 0 :(得分:0)

根据@mvermef的建议,我做了一些研究并想出了一个解决方案。它包括覆盖 WindowManager 类的 EnsureWindow 方法。这是一个例子:

protected override Window EnsureWindow(object model, object view, bool isDialog)
{
    var window = view as Window;
    if (window == null)
    {
        window = new MyCustomWindowClass
        {                 
            SizeToContent = SizeToContent.WidthAndHeight
        };

        // I defined a ContentControl "WindowContent" in MyCustomWindow  
        // class to insert the window's contents
        ((MyCustomWindowClass)window).WindowContent.Content = view;
        window.SetValue(View.IsGeneratedProperty, true);

        var owner = InferOwnerOf(window);
        if (owner != null)
        {
            window.WindowStartupLocation = WindowStartupLocation.CenterOwner;
            window.Owner = owner;
        }
        else
        {
            window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
        }
    }
    else
    {
        var owner = InferOwnerOf(window);
        if (owner != null && isDialog)
        {
            window.Owner = owner;
        }
    }

    return window;
}