4

メッセージ ボックスが表示され、このメッセージ ボックスで [OK] をクリックするのを待たずに、プログラムを続行するようにしたいと考えています。それはできますか?

else
{
    // Debug or messagebox the line that fails
    MessageBox.Show("Cols:" + _columns.Length.ToString() + " Line: " + lines[i]);

}
4

7 に答える 7

5
//You need to add this if you don't already have it

using System.Threading.Tasks;

// 次に、メイン スレッドの非同期で実行するコードを次に示します。

Task.Factory.StartNew( () =>
{
   MessageBox.Show("This is a message");

 });
于 2012-05-17T11:22:56.283 に答える
3

まず、正しい解決策は、メッセージ ボックスをプレーン ウィンドウ (または、winforms を使用している場合はフォーム) に置き換えることです。それは非常に簡単です。例 (WPF)

<Window x:Class="local:MyWindow" ...>
    <Grid>
        <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"
                   Text="{Binding}" />
        <Button HorizontalAlignment="Right" VerticalAlignment="Bottom"
                   Click="SelfClose">Close</Button>
    </Grid>
</Window>

...
class MyWindow : Window
{
    public MyWindow(string message) { this.DataContext = message; }
    void SelfClose(object sender, RoutedEventArgs e) { this.Close(); }
}

...
new MyWindow("Cols:" + _columns.Length.ToString() + " Line: " + lines[i]).Show();

手っ取り早い解決策が必要な場合は、使い捨てスレッドからメッセージボックスを呼び出すだけです。

Thread t = new Thread(() => MessageBox("lalalalala"));
t.SetApartmentState(ApartmentState.STA);
t.Start();

ApartmentState.STA(実際に必要かどうかは不明)

于 2012-05-17T11:16:24.457 に答える
2

これを使って

this.Dispatcher.BeginInvoke(new Action(() => { MessageBox.Show(this, "text"); }));

それが役に立てば幸い。

于 2012-05-17T11:20:40.290 に答える
2
using System.Threading;    

static void MessageThread()
{
    MessageBox.Show("Cols:" + _columns.Length.ToString() + " Line: " + lines[i]);
}

static void MyProgram()
{
    Thread t = new Thread(new ThreadStart(MessageThread));
    t.Start();
}

これにより、独自のスレッドで MessageThread 関数が開始されるため、呼び出した残りのコードをMyProgram続行できます。

お役に立てれば。

于 2012-05-17T11:20:52.990 に答える
2

あなたが望むのはモードレスフォームです。ここにいくつかの情報サンプルがあります。

于 2012-05-17T11:20:58.873 に答える
1

このタスクを達成するには、マルチスレッドを使用する必要があります。このタスクでは、1 つのスレッド (メイン スレッド) が処理を行い、他のスレッドがメッセージ ボックスの表示に使用されます。

于 2012-05-17T11:15:45.257 に答える
1

デリゲートの使用を検討することもできます。

次のスニペットは、私がちょうど終わったものからのものです:-

namespace YourApp
{
  public partial class frmMain : Form
  {
    // Declare delegate for summary box, frees main thread from dreaded OK click
    private delegate void ShowSummaryDelegate();
    ShowSummaryDelegate ShowSummary;

    /// <summary>
    /// Your message box, edit as needed
    /// </summary>
    private void fxnShowSummary()
    {
      string msg;

      msg = "TEST SEQUENCE COMPLETE\r\n\r\n";
      msg += "Number of tests performed: " + lblTestCount.Text + Environment.NewLine;
      msg += "Number of false positives: " + lblFalsePve.Text + Environment.NewLine;
      msg += "Number of false negatives: " + lblFalseNve.Text + Environment.NewLine;

      MessageBox.Show(msg);
    }



    /// <summary>
    /// This callback is used to cleanup the invokation of the summary delegate.
    /// </summary>
    private void fxnShowSummaryCallback(IAsyncResult ar)
    {
      try
      {
        ShowSummary.EndInvoke(ar);
      }
      catch
      {
      }
    }

    /// <summary>
    /// Your bit of code that wants to call a message box
    /// </summary>
    private void tmrAction_Tick(object sender, EventArgs e)
    {
      ShowSummary = new ShowSummaryDelegate(fxnShowSummary);
      AsyncCallback SummaryCallback = new AsyncCallback(fxnShowSummaryCallback);
      IAsyncResult SummaryResult = ShowSummary.BeginInvoke(SummaryCallback, null);
    }

    // End of Main Class
  }
}
于 2012-10-05T14:35:16.330 に答える