none
ProgressBarのIsIndeterminate プロパティ について RRS feed

  • 質問

  • フォームAからプログレスバーがあるフォームBを開きそのプログレスバーのIsIndeterminate プロパティ をtrueにしているのですが、

    プログレスバーが汎用の進行状況で表示されません。

    なぜでしょうか?

    なお

    フォームAにプログレスバーを配置してIsIndeterminate プロパティ をtrueにするとプログレスバーが汎用の進行状況で表示されます。

    別フォームから開いたフォームでは動作しないんでしょうか?

    環境はVisual Studio2008,WPFフォームです。

    2010年3月19日 0:47

回答

  • スレッド化する場合は、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
    2010年3月19日 10:48

すべての返信

  • A に配置されている ProgressBar とは違う ProgressBar を操作しているんでしょう。

    // WinForm でフォームと言っていたのは、WPF ではウィンドウと言うのが普通じゃないかな、クラス名的に。

    2010年3月19日 0:52
  • 特に問題なく両方の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
    2010年3月19日 5:27
  • 言葉足らずで申し訳ありません。

    今やってることは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();

              ~ある処理~

            }

    2010年3月19日 7:28
  • この場合は「ある処理」の期間中Button_Clickイベントが終了しないので他のイベント(プログレスの更新も含む)を処理できない状態ですね。

    スレッド化するとかの対処法を考えてください。
    http://support.microsoft.com/kb/815804/ja


    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    2010年3月19日 7:35
  • スレッド化する場合は、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
    2010年3月19日 10:48
  • >なかむらさん

    ありがとうございます。

    上記のコードで完全に解決しました。

    Dispatcher プロパティは知らなかったので勉強になりました。

    感謝しております。

    2010年3月23日 0:40