WPF Page
でインターフェイスを実現しましたが、Page
のMainWindow
にShowInputAsync
を呼び出したいと思います。そのために、私はAutoResetEvent
でPage
とブロック機能でイベントを発生させる:ShowInputAsyncが表示されない場合があります
public AutoResetEvent OnMessageReceived;
public void MessageReceived(object sender, PageReturnMessageEventArgs e)
{
try
{
if (e.ToString() == "Cancel" || string.IsNullOrEmpty(e.ToString()))
{
throw new Exception("Exception of parsing of hours");
}
}
catch (Exception ex)
{
// log it
}
this.OnMessageReceived.Set();
}
private void Page_OnNextPageClick(object sender, EventArgs e)
{
// ...
MessageShow("Additional information", "How much time will this SuperProcess take?", "HOURS");
OnMessageReceived.WaitOne();
OnMessageReceived.Reset();
// ...
}
私はMainWindow
で任意の関数からShowInputAsync
を表示しようとした場合、それは動作します:
MetroDialogSettings s = new MetroDialogSettings();
s.AffirmativeButtonText = @"Create";
s.NegativeButtonText = @"Cancel";
s.AnimateShow = true;
var result = await this.ShowInputAsync("Test", "TestMessage", s);
if (result == null)
{ return; }
イベントハンドラからこのダイアログを表示しようとすると、動作しません。
var result = await this.ShowInputAsync("Test", "TestMessage", s);
コードは、任意の例外なくPage
に戻り行の後、行に
OnMessageReceived.WaitOne();
を実行し、任意のダイアログせずにウィンドウを示し、すべてのControl
sが表示されて有効になっているが、私はそれを押すことができません。
また、ダイアログを別の関数に入れて、await
と一緒に/なしで呼び出すと、何も変わりません。
コードの実行をブロックするためにDialog
を呼び出した後にAutoResetEvent
を使用するには、役に立たなかった。
private AutoResetEvent OnMessageReturning;
var result = await this.ShowInputAsync(e.Title, e.Message, s);
OnMessageReturning.WaitOne();
も結果なしで、このように別の関数を呼び出そうとしました:
CancellationToken token;
TaskScheduler uiSched = TaskScheduler.FromCurrentSynchronizationContext();
await Task.Factory.StartNew(SeparateFunction, token, TaskCreationOptions.None, uiSched);
は、どのように私は、イベントハンドラで正しくShowInputAsyncを呼び出すことができますか?またはShowInputAsync
をPage
からMainWindow
に電話するにはどうすればよいですか?
P.S.
- MahApps.MetroのV1.4.1(NuGetパッケージ)
- のWindows OS 7
- のVisual Studio Expressの2015 :
- .NET Framework 4.5
TabControl
MainWindow
で、
Page
を使用して1
TabItem
のFrame
に配置されてあります
UPD:簡単なサンプルは
私はGitHubにアップロードしました。上記のリンクはありがたいです。 – Andrii