6

メインウィンドウをシングルトンにしたいのは、アプリ内の他のすべてのウィンドウからメインウィンドウに簡単にアクセスできるようにするためです。しかし、私はそれを実行させることができませんでした。これが私がしたことです。

いつものように、MainWindow請負業者をプライベートにしpublic static MainWindow Instance、静的インスタンスを返すプロパティを作成しました。他の変更を加えずに実行すると、「利用可能なソースがありません」というエラーが発生しました。インターネットをグーグルで検索し、http://www.netframeworkdev.com/windows-presentation-foundation-wpf/xamlc-singleton-class-80578.shtmlで1つの関連トピックを見つけました。しかし、そこで提案されているように動作させることはできませんでした。MainWindow.xamlをから変更することを提案する人もいます

<Window x:Class="TestApp.MainWindow"

<Window x:Class="TestApp.MainWindow.Instance"

これは論理的に見えます。ただし、これを実行すると、大量のコンパイルエラーが発生しました(最初のエラーは、名前空間TestAppに「MainWindow」の定義がすでに含まれていることを示しています)。

シングルインスタンスアプリの作り方について、インターネット上でたくさんの記事を見つけました。私はこれを探していません。MainWindowをシングルトンにしたいだけです。私はWinFormアプリで何度もそれを行いました。

4

4 に答える 4

17

シングルトンにするかどうかはわかりませんが、なぜそうしたいのですか?Application.Current.MainWindowを使用すると、アプリケーションのどこからでもいつでもApplication.MainWindowプロパティを取得できます。http://msdn.microsoft.com/en-us/library/system.windows.application.mainwindow(を参照してください。 v = VS.90).aspx

Window mainWin = Application.Current.MainWindow;
mainWin.Title = "This will be set as the title of the Main Window";

それをシングルトンにすることはまだ私には意味がありません-それはどのようにそれをよりアクセスしやすくしますか?メインウィンドウへの参照は、いつでもパブリック静的変数に保存できます。これは、メインウィンドウのコンストラクターで設定できます。

public partial class MainWindow : Window
{
    public static MainWindow myMainWindow; // ASSUMPTION: only one MainWindow is ever constructed otherwise this will be overwritten by latest such instance

    public MainWindow()
    {
        InitializeComponent();            
        myMainWindow = this;
    }
}

しかし、上記のApplication.Current.MainWindowを考えると、なぜわざわざ..

于 2010-09-30T04:08:46.683 に答える
15

シングルトンを作成するにはMainWindow、次の手順を実行する必要があります。クラスにaMainWindow Instanceを追加します。MainWindow

public static MainWindow Instance { get; private set; }

注:setアクセサーはプライベートであるため、他の誰もそれを他のものに設定することはできません。

に静的コンストラクターを追加し、MainWindowのコンストラクターを次のMainWindow privateように作成します...

static MainWindow()
{
    Instance = new MainWindow();
}

private MainWindow()
{
    InitializeComponent();
}

次に、ファイルから削除StartupUri="MainWindow.xaml"してApp.xaml、アプリケーションの起動時にデフォルトのウィンドウが起動されないようにします。次のように、App.xaml.csでAppクラスのStartupイベントをキャッチします。

public App()
{
    ...
    Startup += App_Startup;
    ...
}

void App_Startup(object sender, StartupEventArgs e)
{
    TestApp.MainWindow.Instance.Show();
}
于 2010-09-30T07:02:56.523 に答える
4

App.xamlファイルから削除StartupUri="MainWindow.xaml"します。WPFはウィンドウを起動しなくなります。

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

App.xaml.csのクラスのStartupイベントにハンドラーを追加します。 このハンドラーで、シングルトンインスタンスのメソッドを呼び出します。App
Show()

using System;
using System.Windows;

namespace WpfApplication1
{
    public partial class App : Application
    {
        public App()
        {
            Startup += new StartupEventHandler(App_Startup);
        }

        void App_Startup(object sender, StartupEventArgs e)
        {
            WpfApplication1.MainWindow.Instance.Show();
        }
    }
}

注:クラスには、というAppプロパティがあるMainWindowためApp_Startup()、クラスの前にMainWindow名前空間を付けました。

于 2010-09-30T06:12:14.863 に答える
0

迅速な回答をありがとうございました。重要な点は、StartupUri="MainWindow.xaml"App.xamlから削除する必要があるということです。静的コンストラクターの先端にも感謝します。私が言及したいもう1つのポイントは、OnStartupをオーバーライドしてメインウィンドウを起動することもできるということです(数行を短くするためだけです)。

 public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            TestApp.MainWindow.Instance.Show();
        }
    }
于 2010-09-30T13:56:07.390 に答える