停靠窗口

Extension 可以通过提供作为内容的用户控件及其视图模型,来显示停靠窗口。

对话框窗口 (模态或非模态) 可以通过WPF的标准功能进行显示,因此 API 不提供相关支持。

用于用户控件的视图模型类必须实现接口 IRCXUserControlViewModel。

internal partial class DockingWindowContentViewModel : IRCUserControlViewModel
{
    /// <inheritdoc />
    public string Id => Main.CommonId;

    /// <inheritdoc />
    public string ViewModelId => $"MyExtension.DockingWindow";

    /// <inheritdoc />
    public bool KeepOpenWhenProjectClosing => false;

    /// <summary>
    /// Captions
    /// </summary>
    public static IRCXCaptionGetter Captions { get; } = Main.Captions!;

    /// <inheritdoc />
    public RCXCaption WindowCaption { get; set; } = new(Main.CommonId, Caption.WindowTitle);

    /// <inheritdoc />
    public ImageSource? WindowIcon { get; set; } = Main.CommonIcon;

    /// <inheritdoc />
    public Task<bool> CloseAsync()
    {
        return Task.FromResult(true);
    }

    /// <inheritdoc />
    public Task<bool> SaveAsync()
    {
        return Task.FromResult(true);
    }

    /// <inheritdoc />
    public void Reload()
    {
    }

    /// <inheritdoc />
    public void Copy()
    {
    }

    /// <inheritdoc />
    public void Cut()
    {
    }

    /// <inheritdoc />
    public void Paste()
    {
    }

    /// <inheritdoc />
    public void SelectAll()
    {
    }

    /// <inheritdoc />
    public void Undo()
    {
    }

    /// <inheritdoc />
    public void Redo()
    {
    }

    /// <inheritdoc />
    public void ShowHelp()
    {
    }

    /// <summary>
    /// Show docking window
    /// </summary>
    /// <returns>Task</returns>
    public static async Task Show()
    {
        DockingWindowContent control = new();

        if (control.DataContext is DockingWindowContentViewModel controlViewModel)
        {
            await Main.GetAPI<IRCXWindowAPI>().ShowDockingWindowAsync(controlViewModel, control);
        }
    }
}

编辑命令 (Copy、Cut、Paste、SelectAll、Undo、Redo) 通过主窗口的编辑菜单中对应项目的选择来调用。

要获取或设置各菜单项的启用/禁用状态时,请使用窗口 API 的 GetContentState 或 SetContentState 方法。

以下是在上述 DockingWindowContentViewModel 中启用 Undo 的示例。

var api = Main.GetAPI<IRCXWindowAPI>();

var state = api.GetContentState(this);
api.SetContentState(this, state | ContentState.CanUndo);

窗口显示期间按下 F10 键时,会调用 ShowHelp 方法。

以下是在 ShowHelp 中显示 Extension 所含 PDF 手册的示例。(在本示例中,假定 PDF 手册文件位于项目的 Resources 文件夹中。要将文件包含到 Extension 中,请在 Visual Studio 中将文件属性的“生成操作”设置为“内容”,并将“复制到输出目录”设置为“始终复制”或“如果较新则复制”。

public void ShowHelp()
{
    try
    {
        var helpFilePath = Path.Combine(
            Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!,
            "Resources",
            "Manual.pdf"
        );

        ProcessStartInfo processStartInfo = new()
        {
            FileName = helpFilePath,
            UseShellExecute = true,
        };
        Process.Start(processStartInfo);
    }
    catch (Exception)
    {
        // Error handling
    }
}