VB のたまご

作成日: 2017/03/05, 更新日: 2017/03/05



ProgressBar

    イメージ
  •  ProgressBar は、作業中の進捗を視覚的に表現するためのコントロールです。 とりあえずどういう風に動くのか見てみましょう。 以下サンプルです。「ProgressBarWindow1」という画面で作成していますが、「MainWindow」に書いても構いません。

  • スポンサーリンク


    <Window x:Class="ProgressBarWindow1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:z04_NormalControls"
            mc:Ignorable="d"
            Title="ProgressBarWindow1" Height="300" Width="300">
        
        <StackPanel>
    
            <StackPanel Margin="10">
                <ProgressBar Name="progressbar1" Value="50" Height="20" />
                <TextBlock Text="{Binding ElementName=progressbar1, Path=Value}" />
            </StackPanel>
    
            <StackPanel Margin="10">
                <ProgressBar Name="progressbar2" IsIndeterminate="True" Height="20" />
                <TextBlock Text="{Binding ElementName=progressbar2, Path=Value}" />
            </StackPanel>
    
        </StackPanel>
        
    </Window>
    

  •  ProgressBar には2種類の表示表現があって、1つ目は通常の進捗、2つ目は進捗の報告というよりは、現在動作中であること、(プログラムがフリーズして応答していない)わけではない、ことを通知するための表現です。 1つ目の ProgressBar には、最大値(Maximum)、最小値(Minimum)は未記載です。この場合 Maximum は 100、Minimum は 0 となります。 現在値(Value)に 50 をセットしたので、半分まで色付けされています。現在値がいくつかは、TextBlock に表示させています。

  •  2つ目の ProgressBar は IsIndeterminate を True にしています。バーが絶えず移動しながらループしていることが分かります。

  • スポンサーリンク


  •  続いて、プログラム上から進捗を進めるサンプルです。

  • <Window x:Class="ProgressBarWindow2"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:z04_NormalControls"
            mc:Ignorable="d"
            Title="ProgressBarWindow2" Height="300" Width="300"
            Closing="window1_Closing">
    
        <StackPanel>
    
            <StackPanel Margin="10" Orientation="Horizontal">
                <Button Name="button1" Content="開始" Width="80" Click="button1_Click" />
                <Button Name="button2" Content="停止" Width="80" Click="button2_Click" />
            </StackPanel>
    
            <ProgressBar Name="progressbar1" Maximum="10" Height="20" Margin="10,10,10,0" />
            <TextBlock Text="{Binding ElementName=progressbar1, Path=Value}" Margin="10,0,10,10" />
    
        </StackPanel>
    
    </Window>
    

    Imports System.Windows.Threading
    Imports System.ComponentModel
    
    Public Class ProgressBarWindow2
    
        Private timer1 As DispatcherTimer = Nothing
    
        Private Sub button1_Click(sender As Object, e As RoutedEventArgs)
    
            If Me.timer1 Is Nothing Then
                Me.timer1 = New DispatcherTimer
                Me.timer1.Interval = New TimeSpan(0, 0, 1) ' 1秒間隔でイベント発生させる
                AddHandler Me.timer1.Tick, AddressOf Me.timer1_Tick
            End If
    
            Me.timer1.Start()
            Me.button1.IsEnabled = False
            Me.button2.IsEnabled = True
    
        End Sub
    
        Private Sub timer1_Tick(sender As Object, e As EventArgs)
    
            Dim value = Me.progressbar1.Value
            Dim maxValue = Me.progressbar1.Maximum
    
            If value = maxValue Then
                value = 0
            Else
                value += 1
            End If
    
            Me.progressbar1.Value = value
    
        End Sub
    
        Private Sub button2_Click(sender As Object, e As RoutedEventArgs)
    
            If Me.timer1 Is Nothing Then
                Exit Sub
            End If
    
            Me.timer1.Stop()
            Me.button1.IsEnabled = True
            Me.button2.IsEnabled = False
    
        End Sub
    
        Private Sub window1_Closing(sender As Object, e As CancelEventArgs)
    
            If Me.timer1 IsNot Nothing Then
                Me.timer1.Stop()
                RemoveHandler Me.timer1.Tick, AddressOf Me.timer1_Tick
            End If
    
        End Sub
    
    End Class
    

  •  Window タグ内に Closing イベントを定義しているのと、1秒おきに1つ現在値をアップしているので(遅いので)、最大値は 10 に制限しています。 今回使用した System.Windows.Threading.DispatcherTimer は、Tick イベント内も UI スレッドで動作するので、コントロールへのアクセスを気にしなくていいので使用しました。 意味わからなくても OK です。