【问题标题】:How to remove the maximize button from Caliburn Windows Manager Dialog如何从 Caliburn Windows 管理器对话框中删除最大化按钮
【发布时间】:2011-12-19 22:29:11
【问题描述】:

我正在使用 Caliburn Micro Window Manager 来显示一个对话框。我想从对话框中删除最大化和最小化按钮。

如果我查看 Windows 管理器源代码(在 WPF 下),我可以看到第三个参数,它可以让我将设置传递给对话框。我的问题是我不能传递第三个参数——我得到一个错误。这可以在 hello 窗口管理器示例项目中复制。

有什么想法吗?

不知何故,我似乎在引用一个只允许 ShowDialog 2 个参数的 IWindowManager。

这是我想做的,但会导致错误:

var loginViewModel = new LoginViewModel();

WindowManager windowManager = new WindowManager();

Dictionary<string, object> settings = new Dictionary<string, object>();

// add settings here to pass to dialog

windowManager.ShowDialog(loginViewModel, null, settings);

这是显示 3 个参数的 IWindowManager 界面:

public interface IWindowManager
{
    /// <summary>
    /// Shows a modal dialog for the specified model.
    /// </summary>
    /// <param name="rootModel">The root model.</param>
    /// <param name="context">The context.</param>
    /// <param name="settings">The optional dialog settings.</param>
    /// <returns>The dialog result.</returns>
    bool? ShowDialog(object rootModel, object context = null, IDictionary<string, object> settings = null);

    /// <summary>
    /// Shows a non-modal window for the specified model.
    /// </summary>
    /// <param name="rootModel">The root model.</param>
    /// <param name="context">The context.</param>
    /// <param name="settings">The optional window settings.</param>
    void ShowWindow(object rootModel, object context = null, IDictionary<string, object> settings = null);

    /// <summary>
    /// Shows a popup at the current mouse position.
    /// </summary>
    /// <param name="rootModel">The root model.</param>
    /// <param name="context">The view context.</param>
    /// <param name="settings">The optional popup settings.</param>
    void ShowPopup(object rootModel, object context = null, IDictionary<string, object> settings = null);
}

【问题讨论】:

  • 请展示一些代码,供我们这些不熟悉 Caliburn Micro 实现细节的人使用。 :)
  • 已添加代码示例。

标签: wpf caliburn.micro


【解决方案1】:

不要让你的 View as Usercontrol 让它成为一个 Window 并设置它的 ResizeMode="NoResize"

<Window x:Class="Company.Project.Views.MyView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    ResizeMode="NoResize">

现在您将只有红色的“X”关闭按钮,没有最大化/最小化按钮。

【讨论】:

    【解决方案2】:
    dynamic settings = new ExpandoObject();
                settings.WindowStyle = WindowStyle.ToolWindow;
                settings.ShowInTaskbar = false;
                settings.Title = "Test";
    
    windowManager.ShowDialog(loginViewModel, "Modeless", settings);
    

    【讨论】:

      【解决方案3】:

      我不记得有任何使用 IWindowManager.ShowDialog 和三个参数的最新版本的 Caliburn.Micro。你可能指的是this link from the Codeplex site?这似乎是 Rob 拒绝的用户请求。

      您可能知道,ShowDialog() 将导致 IWindowManager 实例化它找到的视图(通过命名约定)并将其附加到您提供的任何视图模型(例如,LoginViewModel 附加到名为 LoginView 的“找到”视图)。

      我猜 LoginView 是您的 UserControl,但您可以将此视图设置为常规窗口,然后将 WindowStyle 属性(在 XAML 中)设置为使用没有最大化按钮的选项之一。 This MSDN article 显示了各种枚举选项。 WindowStyle.ToolWindow 是唯一一个包含关闭按钮而不是最小/最大按钮的按钮,但由于它改变了关闭按钮的外观,您可能更喜欢 WindowStyle.None 并只定义您自己的窗口镶边和按钮。

      <Window x:Class="MyNamespace.LoginView"
              ...
              WindowStyle="ToolWindow">
          ...
      </Window>
      

      【讨论】:

      • 我添加到问题中的示例代码取自 Caliburn v1.2 源代码,并显示了带有 3 个参数的 IWindowManager.ShowDialog。 Caliburn 使用第三个参数来设置窗口的属性。然而,即使在 HelloWindowManager 示例中,我也无法设置第三个参数,因此必须以某种方式使用不同的接口。非常令人费解。感谢您的建议 - 我会试一试。
      • 我明白你现在指的是“ShowPopup”,但 ShowDialog 没有方法签名。即使使用 ShowPopup,我也不确定它会如何工作。
      • 不确定你的意思。我提供的代码示例中 ShowDialog 的方法签名有 3 个参数。
      • 对,但是使用 Caliburn.Micro RTW 1.2,IWindowManger 界面不使用您在帖子中为 ShowDialog() 和 ShowWindow() 引用的相同签名。
      • 正在查看 v1.3 源代码 - 第三个参数在那里。删除 Nuget 包,手动安装 v1.3 和所有作品。
      猜你喜欢
      • 2011-08-03
      • 2011-02-09
      • 2011-11-26
      • 2013-10-10
      • 2011-05-14
      • 2012-10-24
      • 2015-05-02
      • 1970-01-01
      相关资源
      最近更新 更多