0

David Veeneman によるWindows Forms User Settings に関する Code Project の記事に基づいて、アプリケーションの開始位置と開始サイズを保存してみました。

単一のインスタンスでは完全に機能しますが、複数のインスタンスに拡張すると問題が発生します。

設定ファイルへの書き込みと設定ファイルからの書き込みを保護するために、設定の読み込みとミューテックスへの設定の保存に関するセクションをラップしました。

ウィンドウを最後の既知の場所から積み重ねたいと思います。ほとんどの場合、これで問題なく動作するように見えますが、4 つまたは 5 つのウィンドウを立て続けに開くと、最初の 3 つが完全に開きますが、ギャップが生じ、その後、いくつかのウィンドウが同じ場所で開き始めます。

フォーム/アプリケーションをレンダリングします。

 private Mutex saveSetting;
 private const int START_LOCATION_OFFSET = 20;

 private void MainForm_Load(object sender, EventArgs e)
    {
        // Get the mutex before the reading of the location
        // so that you can't have a situation where a window drawn
        // in the incorrect position.

        this.saveSetting = new Mutex(false, "SaveSetting");
        this.saveSetting.WaitOne();

        this.LoadWindowStartSizeAndLocation();
        .
        .
        .
        .
        .

        this.saveSetting.ReleaseMutex();
    }

設定のロード:

private void LoadWindowStartSizeAndLocation()
        {
            // Set window location
            if (Settings.Default.WindowLocation != null)
            {
                System.Drawing.Point startLocation = 
                  new System.Drawing.Point
                     (Settings.Default.WindowLocation.X + START_LOCATION_OFFSET,
                      Settings.Default.WindowLocation.Y + START_LOCATION_OFFSET);

                this.Location = startLocation;
                Settings.Default.WindowLocation = startLocation;

                Settings.Default.Save();
            }

            // Set window size
            if (Settings.Default.WindowSize != null)
            {
                this.Size = Settings.Default.WindowSize;
            }
        }

設定の保存:

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        try
        {
            this.SaveWindowSizeAndLocationForNextStart();                
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.Assert(false, ex.Message);
        }
    }

    /// <summary>
    /// Save the Window Size And Location For the next Application Start up.
    /// </summary>
    private void SaveWindowSizeAndLocationForNextStart()
    {
        if (this.WindowState != FormWindowState.Minimized)
        {
            // Copy window location to app settings
            Settings.Default.WindowLocation = this.Location;
            Settings.Default.WindowSize = this.Size;
        }
        try
        {
            this.saveSetting = new Mutex(false, "SaveSetting");
            this.saveSetting.WaitOne();

           Settings.Default.Save();
        }
        catch
        {
            // Do nothing. It won't permanently disable the system if we
            // can't save the settings.
        }
        finally
        {
            this.saveSetting.ReleaseMutex();
        }
    }

誰か私が何をしているのか教えてもらえますか? または、上記のコードに基づいて、2 つのインスタンスを同じ開始位置にレンダリングするにはどうすればよいでしょうか??

ありがとう A

4

1 に答える 1

1

問題は、ミューテックスが取得される前に設定が読み込まれることです。Settings.Default.Reload()ミューテックスを取得してから呼び出します。

于 2013-02-07T11:57:33.030 に答える