停駐視窗

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
    }
}