0

我有一个使用 Caliburn.micro 和自定义窗口管理器的应用程序。窗口管理器正在创建我自己的基本窗口,因此我可以自定义整个应用程序的外观。

我想在窗口上添加一些控件,例如:

<DockPanel>
    <ContentPresenter Content="{Binding CustomContent}" />
    <StatusBar Height="20" DockPanel.Dock="Bottom" Background="Blue"/>
</DockPanel>

我想让 Caliburn 将我的 ViewModel 中的用户控件放在 ContentPresenter 中,但 Caliburn 正在替换我窗口的全部内容。

我在窗口中做了这个:

using System.Windows;

namespace CaliburnCustomWindow
{
    public partial class WindowBase
    {
        public static readonly DependencyProperty CustomContentProperty = DependencyProperty.Register("CustomContent", typeof (object), typeof (WindowBase));

        public object CustomContent
        {
            get { return GetValue(CustomContentProperty); }
            set { SetValue(CustomContentProperty, value); }
        }

        public WindowBase()
        {
            InitializeComponent();
        }
    }
}

然后修改我的 WindowManager 来做到这一点:

using System.Windows;
using Caliburn.Micro;

namespace CaliburnCustomWindow
{
    internal class AppWindowManager : WindowManager
    {
        protected override Window EnsureWindow(object model, object view, bool isDialog)
        {
            Window window = view as Window;

            if (window == null)
            {
                if (view.GetType() == typeof (MainView))
                {
                    window = new WindowBase
                    {
                        CustomContent = view,
                        SizeToContent = SizeToContent.Manual
                    };

                    window.Height = 500;
                    window.Width = 500;
                }

                window.SetValue(View.IsGeneratedProperty, true);
            }
            else
            {
                Window owner2 = InferOwnerOf(window);
                if (owner2 != null && isDialog)
                {
                    window.Owner = owner2;
                }
            }
            return window;
        }
    }
}

但它不起作用。与 CustomContent 依赖属性的绑定似乎不起作用。

有可能做到这一点吗?如果有怎么办?

4

1 回答 1

1

您能否不使用默认WindowManager实现,并传入包装器的新实例DialogViewModel(并创建关联的DialogView):

this.WindowManager.ShowDialog(new DialogViewModel(myViewModel));

IDialogPresenter如果您想简化客户端代码,或者在一个或类似的实现中抽象此代码:

this.DialogPresenter.Show(myViewModel);
于 2013-05-15T07:57:42.150 回答