トップ回答者
ProgressBarのIsIndeterminate プロパティ について

質問
回答
-
スレッド化する場合は、Window2 を Close するときに、UI スレッド上(Window1 と同じスレッド)で Close するように気をつけてください。ちなみに UI スレッド上で Close するには、Dispatcher プロパティを使います。こんな風に。
public partial class Window1 : Window { public Window1() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { Window2 window2 = new Window2(); window2.Show(); var thread = new Thread((ThreadStart)delegate { // ~ある処理~ // UI スレッド上で Window を閉じる Dispatcher.Invoke((Action)delegate { window2.Close(); }); }); thread.Start(); } }
なかむら(http://d.hatena.ne.jp/griefworker)- 回答としてマーク yty0918 2010年3月23日 0:40
すべての返信
-
特に問題なく両方のWindowでプログレスバーが汎用の進行状況で表示されます。
何か勘違いをされていませんでしょうか?
または実行状況が違うのでしょうか?<Window x:Class="Progress.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <ProgressBar Name="progressBar1" IsIndeterminate="True" /> <Button Grid.Row="1" Click="Button_Click" /> </Grid> </Window>
<Window x:Class="Progress.Window2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window2" Height="300" Width="300"> <Grid> <ProgressBar Name="progressBar1" IsIndeterminate="True" /> </Grid> </Window>
namespace Progress { /// <summary> /// Window1.xaml の相互作用ロジック /// </summary> public partial class Window1 : Window { public Window1() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { var window = new Window2(); window.Show(); } } }
えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12 -
言葉足らずで申し訳ありません。
今やってることはWindow2を開いたあと、ある処理をしてWindow2を閉じるということをしています。
以下のようなことです。
private void Button_Click(object sender, RoutedEventArgs e)
{
var window = new Window2();
window.Show();~ある処理~
window.Close();
}
このときにWindow2を開いたときにプログレスバーが汎用の進行状況で表示されませんでした。
以下のようにした場合はWindow2が表示されたままですがButton_Clickイベントが終了した後、
Window2でプログレスバーが汎用の進行状況で表示されました。
private void Button_Click(object sender, RoutedEventArgs e)
{
var window = new Window2();
window.Show();~ある処理~
}
-
この場合は「ある処理」の期間中Button_Clickイベントが終了しないので他のイベント(プログレスの更新も含む)を処理できない状態ですね。
スレッド化するとかの対処法を考えてください。
http://support.microsoft.com/kb/815804/ja
えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12 -
スレッド化する場合は、Window2 を Close するときに、UI スレッド上(Window1 と同じスレッド)で Close するように気をつけてください。ちなみに UI スレッド上で Close するには、Dispatcher プロパティを使います。こんな風に。
public partial class Window1 : Window { public Window1() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { Window2 window2 = new Window2(); window2.Show(); var thread = new Thread((ThreadStart)delegate { // ~ある処理~ // UI スレッド上で Window を閉じる Dispatcher.Invoke((Action)delegate { window2.Close(); }); }); thread.Start(); } }
なかむら(http://d.hatena.ne.jp/griefworker)- 回答としてマーク yty0918 2010年3月23日 0:40