c# - 在 WPF 中打开关联文件,例如 'notepad++ tab features'

标签 c# wpf tabs associations notepad

这个问题是关于 WPF 应用程序的。 我想用我的自定义应用程序打开一些关联文件。 我找到了打开关联文件的方法。 但是,我仍然不知道如何处理重复的申请。

例如, 如果我点击“a.txt2”,我的应用程序会打开它。 然后我单击“a2.txt2”,它还会打开我的应用程序的另一个进程。

我只想在第一个应用程序中获得第二次点击信息,而不是在关联文件被多次点击时我的应用程序的执行。 它类似于“ Notepad++ ”打开文件到选项卡功能。

这是我的代码。

1个主窗口.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        this.Loaded += new RoutedEventHandler(MainContainer_Loaded);
    }
    void MainContainer_Loaded(object sender, RoutedEventArgs e)
    {
        string fn = "x";
        if (Application.Current.Properties["ArbitraryArgName"] != null)
        {
            fn = Application.Current.Properties["ArbitraryArgName"].ToString();

        }
        this.Title = fn;
    }
}

2 个应用程序.xaml

<Application x:Class="sample.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         >
<Application.Resources>

</Application.Resources>
<!--
StartupUri="MainWindow.xaml"
Startup="App_Startup"--></Application>

3 个应用程序.cs

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        // Check if this was launched by double-clicking a doc. If so, use that as the
        // startup file name.
        string fname = "No filename given";
        if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData != null
        && AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData.Length > 0)
        {

            try
            {
                fname = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0];

                // It comes in as a URI; this helps to convert it to a path.
                Uri uri = new Uri(fname);
                fname = uri.LocalPath;

                this.Properties["ArbitraryArgName"] = fname;
            }
            catch
            {
                // For some reason, this couldn't be read as a URI.
                // Do what you must...
            }
        }

        string procName = Process.GetCurrentProcess().ProcessName;

        // get the list of all processes by the "procName"       
        Process[] processes = Process.GetProcessesByName(procName);
        if (processes.Length > 1)
        {

            MessageBox.Show(procName + " already running");

            //App a = new App();
            //a.Shutdown();
        }
        else
        {
        }
        MainWindow mainWindow = new MainWindow();
        mainWindow.Show();
        base.OnStartup(e);
    }
}

谢谢。

最佳答案

使用“Microsoft.VisualBasic”命名空间可用的底部单例实例技术:

using System;

namespace Sample
{
    public class Startup
    {
        [STAThread]
        public static void Main(string[] args)
        {
            SingleInstanceApplicationWrapper wrapper = new SingleInstanceApplicationWrapper();
            wrapper.Run(args);
        }
    }

    public class SingleInstanceApplicationWrapper :
        Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
    {
        public SingleInstanceApplicationWrapper()
        {
            // Enable single-instance mode.
            this.IsSingleInstance = true;
        }

        // Create the WPF application class.
        private WpfApp app;
        protected override bool OnStartup(
            Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)
        {


            app = new WpfApp();
            app.Run();

            return false;
        }

        // Direct multiple instances
        protected override void OnStartupNextInstance(
            Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs e)
        {
            if (e.CommandLine.Count > 0)
            {
                ((MainWindow)app.MainWindow).openFile(e.CommandLine[0]);
            }
        }
    }

    public class WpfApp : System.Windows.Application
    {
        protected override void OnStartup(System.Windows.StartupEventArgs e)
        {
            base.OnStartup(e);

            // Load the main window.
            MainWindow main = new MainWindow();
            this.MainWindow = main;
            main.Show();

            // Load the document that was specified as an argument.
            if (e.Args.Length > 0) main.openFile(e.Args[0]);
        }



    }   
}

关于c# - 在 WPF 中打开关联文件,例如 'notepad++ tab features',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33155553/

相关文章:

java - 我的选项卡小部件不显示图片图标

c# - 单击选项卡控件的选定选项卡页眉时如何触发事件

jquery - 屏幕底部的选项卡,单击时随内容上升

c# - ObservableCollection 添加项目

c# - 使用 HtmlHelper DisplayFor 的字符串值 "Boolean"问题

c# - 哈希函数的字节到字符串?

C# 枚举拼写错误更正

c# - MySqlMembershipProvider 的表前缀

c# - 一个 XmlDataProvider WPF 的多个 XPath

c# - 来自 xaml 的 WPF 控件引用在代码端不可见