Как правильно создать одноэкземплярное приложение WPF?

Вы можете использовать класс .cs-file Mutex, но вскоре вы обнаружите, что c#.net вам нужно будет реализовать csharp код для передачи аргументов c-sharp и т.п. самостоятельно. Что c-sharp ж, я научился одному трюку c-sharp при программировании в WinForms, когда c-sharp читал Chris Sell's book. Этот трюк использует c# логику, которая уже доступна .net нам во фреймворке. Не знаю, как visual-c# вы, но когда я узнаю о вещах, которые c-sharp можно повторно использовать wpf во фреймворке, я обычно иду visual-c# по этому пути, а не изобретаю .net велосипед. Если, конечно, он wpf не делает все, что я хочу.

Когда c#-language я занялся WPF, я придумал .net способ использовать тот же dotnet код, но в приложении WPF. Это c#.net решение должно соответствовать c#.net вашим потребностям, исходя c# из вашего вопроса.

Во-первых, нам c#-language нужно создать наш класс приложения. В dot-net этом классе мы переопределим csharp событие OnStartup и создадим .net метод Activate, который будет c# использоваться позже.

public class SingleInstanceApplication : System.Windows.Application
{
    protected override void OnStartup(System.Windows.StartupEventArgs e)
    {
        // Call the OnStartup event on our base class
        base.OnStartup(e);

        // Create our MainWindow and show it
        MainWindow window = new MainWindow();
        window.Show();
    }

    public void Activate()
    {
        // Reactivate the main window
        MainWindow.Activate();
    }
}

Во-вторых, нам wpf нужно создать класс, который mutex сможет управлять нашими экземплярами. Прежде .net-framework чем перейти к этому, мы на visual-c# самом деле собираемся повторно c#-language использовать некоторый код, который visual-c# находится в сборке Microsoft.VisualBasic. Поскольку .net в этом примере я использую dot-net C#, мне пришлось сделать visual-c# ссылку на сборку. Если вы csharp используете VB.NET, вам не .cs-file нужно ничего делать. Класс, который .net мы собираемся использовать, называется .cs-file WindowsFormsApplicationBase, и .net мы наследуем от него наш visual-c# диспетчер экземпляров, а mutex затем используем свойства c#-language и события для обработки единичного dotnet экземпляра.

public class SingleInstanceManager : Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
{
    private SingleInstanceApplication _application;
    private System.Collections.ObjectModel.ReadOnlyCollection _commandLine;

    public SingleInstanceManager()
    {
        IsSingleInstance = true;
    }

    protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs eventArgs)
    {
        // First time _application is launched
        _commandLine = eventArgs.CommandLine;
        _application = new SingleInstanceApplication();
        _application.Run();
        return false;
    }

    protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
    {
        // Subsequent launches
        base.OnStartupNextInstance(eventArgs);
        _commandLine = eventArgs.CommandLine;
        _application.Activate();
    }
}

По сути, мы используем .cs-file биты VB для обнаружения отдельных csharp экземпляров и соответствующей c# обработки. OnStartup будет c#-language запущен при загрузке первого c# экземпляра. OnStartupNextInstance c-sharp запускается при повторном wpf запуске приложения. Как видите, я mutex могу получить то, что было dotnet передано в командной строке, через wpf аргументы события. Я установил wpf значение в поле экземпляра. Вы dot-net можете разобрать командную c#-language строку здесь или передать c-sharp ее своему приложению через visual-c# конструктор и вызов метода mutex Activate.

В-третьих, пришло c#.net время создать нашу EntryPoint. Вместо dot-net того, чтобы обновлять приложение, как .cs-file вы обычно это делаете, мы dot-net воспользуемся преимуществами dot-net нашего SingleInstanceManager.

public class EntryPoint
{
    [STAThread]
    public static void Main(string[] args)
    {
        SingleInstanceManager manager = new SingleInstanceManager();
        manager.Run(args);
    }
}

Что c# ж, я надеюсь, что вы сможете csharp следить за всем и сможете dot-net использовать эту реализацию .net-framework и сделать ее своей.

c#

.net

wpf

mutex

2022-11-18T21:56:05+00:00
Вопросы с похожей тематикой, как у вопроса:

Как правильно создать одноэкземплярное приложение WPF?