WPF ProgressDialog

得闲无事,做了个ProgressDialog。希望对大家有用。

ProgressDialog.xaml

<Window x:Class="WpfApplication1.ProgressDialog"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ProgressDialog"  Width="310" Height="100" 
        Topmost="True" ShowInTaskbar="False" WindowStartupLocation="CenterScreen"
        WindowStyle="None" ResizeMode="NoResize" BorderBrush="Silver" BorderThickness="1">

    <Grid Margin="5" Background="Honeydew">
        <Grid.RowDefinitions>
            <RowDefinition Height="25"></RowDefinition>
            <RowDefinition Height="30"></RowDefinition>
            <RowDefinition Height="35"></RowDefinition>
        </Grid.RowDefinitions>
        <TextBlock Text="处理中。。。"  Name="label1"  Grid.Row="0" VerticalAlignment="Center" x:FieldModifier="private" />
        <ProgressBar Name="progressBar1" Grid.Row="1" Maximum="100" x:FieldModifier="private" />
        <Grid Grid.Row="2" Margin="0,5" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition Width="60"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <TextBlock  Name="infoBlock"  VerticalAlignment="Center" x:FieldModifier="private" />
            <Button Grid.Column="1" Content="取消" Width="50" Click="Button_Click" HorizontalAlignment="Right" />
        </Grid>
    </Grid>
</Window>

ProgressDialog.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// ProgressDialog.xaml 的交互逻辑
    /// </summary>
    public partial class ProgressDialog : Window
    {
        public ProgressDialog()
        {
            InitializeComponent();
        }
        public void SetProgressValue(double value)
        {
            this.progressBar1.Value = value;
        }

        public void SetMessage(string mess)
        {
            this.infoBlock.Text = mess;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            throw new UserExitException();
        }
    }

    public class UserExitException : Exception
    {
        public UserExitException()
            : base("用户退出!!")
        {
        }
    }
}

ProgressDialogHelper.cs(辅助类)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.ComponentModel;
using System.Threading;

namespace WpfApplication1
{
    public class ProgressDialogHelper
    {
        public ProgressDialog ProDialog ;
        public Thread Worker;

        public void CloseProgressDialog()
        {
            ProDialog.Dispatcher.BeginInvoke(new Action(() =>
            {
                ProDialog.Close();
            }));
        }

        public void WorkerThreadAbort()
        {
            if (Worker.IsAlive)
                Worker.Abort();
        }

        public void SetValueAndMessage(double value, string mess)
        {
            ProDialog.Dispatcher.BeginInvoke(new Action(() =>
            {
                ProDialog.SetProgressValue(value);
                ProDialog.SetMessage(mess);
            }));
        }

        public void SetValue(double value)
        {
            ProDialog.Dispatcher.BeginInvoke(new Action(() =>
            {
                ProDialog.SetProgressValue(value);
            }));
        }

        public void SetMessage(string mess)
        {
            ProDialog.Dispatcher.BeginInvoke(new Action(() =>
            {
                ProDialog.SetMessage(mess);
            }));
        }

        public void Show(Action workAction)
        {
            this.Worker = new Thread(new ThreadStart(workAction));
            this.ProDialog = new ProgressDialog();

            Worker.Start();
            ProDialog.ShowDialog();
        }
    }
}

调用方法

            ProgressDialogHelper pdh = null;
            try
            {
                pdh = new ProgressDialogHelper();
                pdh.Show(() =>
                {  //耗时操作
                    for (int i = 0; i < 100; i++)
                    {
                        System.Threading.Thread.Sleep(100);
                        pdh.SetValue(i);//控制进度。
                    }
                    //耗时操作内关闭ProgressDialog
                    pdh.CloseProgressDialog();
                });
            }
            catch
            {  //异常时退出
                pdh.CloseProgressDialog();
                pdh.WorkerThreadAbort();
            }

当然,也能用BusyIndicator 代替ProgressDialog 。

 

posted @ 2011-10-14 19:41  Ken83  阅读(1299)  评论(0编辑  收藏  举报