Как правильно создать одноэкземплярное приложение 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
Как правильно создать одноэкземплярное приложение WPF?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.