私はWindows 10 UWPアプリケーションを使用しています。私のXAMLには、プログレスバーを表示するためのStackPanelがあります。したがって、デフォルトでは、StackPanelの可視性は折りたたまれて設定されています。次に、私のコードでは、ユーザーがボタンをクリックした後に可視性を表示するように設定しようとしていますが、何らかの処理を行うメソッドを呼び出します。この例では、パネルは決して表示されません。私がテスト中に気づいWindows 10 UWP StackPanel可視性が動作しない
private void BtnProcess_OnClick(object sender, RoutedEventArgs e)
{
//Set the progress panel to visible
toggleProgressPanel(true);
//This is a long running process that can take 3-5 seconds.
ProcessRequest();
//Hide the progress panel
toggleProgressPanel(false);
}
private void toggleProgressPanel(bool show)
{
pnlProgressBar.Visibility = show ? Visibility.Visible : Visibility.Collapsed;
}
ことの一つは、私は明らかのprocessRequestコールとプログレスパネルの隠ぺいをコメントアウトした場合、それはその時点で表示されますということです。私はまた、ProcessRequestメソッド呼び出しの中にパネルを表示して隠してみました。メソッドの最初に表示し、最後に表示していました。
長時間実行されているメソッドのプロセスは実際に実行するのに3〜5秒かかりますので、パネルが表示されないほど速く隠れているわけではありません。
ほとんどの場合、UIの更新の問題のようですが、私はそれを修正する方法がわかりません。呼び出し元のメソッドBtnProcess_OnClickはそのすべてを実行しているため、UIはBtnProcess_OnClickメソッドが完了して返されるまで実際に更新されることはありません。あれは正しいですか?この場合、どうすれば対処できますか?
私はProcessRequestメソッド呼び出しをTask.Runの中に置くことを嫌っています。そのメソッドはUIとかなりの量の対話を行う必要があり、そのソリューションは別のスレッドに置く必要があります。かなりの量のコードを書いてください(私は思っています)。私は行方不明の簡単な解決策がなければならないと思われますか?
ありがとうございます!
ProcessRequest()は非同期メソッドである必要があります。 – Archana
@Archanaお返事ありがとうございます。したがって、非同期の場合は、技術的に別のスレッドにはないので、私はすべてのUIにアクセスできます。私がこれをしなかった理由は、その方法では何も待たないからです。私が理解しているところでは、たとえメソッドを非同期にしても、メソッドの中に待たれることがなければ、同期は実行されます。それは大丈夫ですか、私はまた、無条件にTask.Delay(100)を追加する必要がありますか?それとも待っているようなもの? –
もし3-5秒かかるなら、それで十分でしょう。今あなたのブロッキングUIを3-4秒間表示するので、可視性を変更しても反映されません。 – Archana