天天看點

如何在WPF中實作類似Android的ProgressDialog效果

先圖為敬

如何在WPF中實作類似Android的ProgressDialog效果

前台代碼

<Window x:Class="Zero_Gjy.UserControls.MProgressBar"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:mui="http://firstfloorsoftware.com/ModernUI"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
              Background="{x:Null}"
            WindowStyle="None"
        AllowsTransparency="True"
        IsHitTestVisible="True"
        WindowStartupLocation="CenterOwner"
        >
    <Grid Style="{StaticResource ContentRoot}">
        <TextBlock Name="tb_progress" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
        <mui:ModernProgressRing IsActive="True" Width="80" Height="80" Style="{Binding SelectedItem.Tag, ElementName=CmbRingStyle}" />
    </Grid>
</Window>
           

代碼中的“mui:ModernProgressRing” 是ModernUI中的一個控件,同學們也可以自己來實作同樣的效果,或者使用ProgressBar來替代,這裡就不贅述了。

背景代碼

using FirstFloor.ModernUI.Windows.Controls;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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.Navigation;
using System.Windows.Shapes;
using Zero_Gjy.Helper;

namespace Zero_Gjy.UserControls
{
    /// <summary>
    /// Interaction logic for MProgressBar.xaml
    /// </summary>
    public partial class MProgressBar : Window, INotifyPropertyChanged
    {
        double progress;
        string progreesStr;

        public event PropertyChangedEventHandler PropertyChanged;

        public double Progress
        {
            get
            {
                return progress;
            }

            set
            {
                progress = value;
                ProgreesStr = (int)(value/Max * ) + "%";
            }
        }

        public string ProgreesStr
        {
            get
            {
                return progreesStr;
            }

            set
            {
                progreesStr = value;
                if(PropertyChanged != null)
                {
                    this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("ProgreesStr"));
                }
            }
        }

        public MProgressBar()
        {
            InitializeComponent();
            this.tb_progress.SetBinding(TextBlock.TextProperty, new Binding("ProgreesStr") { Source = this });
        }
        public int Max = ;
        public void Show(Window parent,int max)
        {            
            Max = max;
            this.Progress = ;
            this.Owner = parent;
            this.Owner.Opacity = ;
            this.Owner.IsEnabled = false;
            this.Show();
        }
        public void UpdateProgress(int progress)
        {
            this.Progress = progress;
        }
        public void CloseWindow()
        {
            this.Close();
            this.Owner.Opacity = ;
            this.Owner.IsEnabled = true;
        }
    }
}
           

背景代碼将進度值和前台的TextBlock綁定,實作進度的更新,特别要注意的是這幾句

this.Owner = parent;//父視窗
            this.Owner.Opacity = ;//置灰
            this.Owner.IsEnabled = false;//禁用
            this.Show();//子視窗模式顯示
           

有的同學或許會說直接用ShowDialog()就行了,我試過之後發現父視窗無法實時更新進度,程序都在等待Dialog。。。

響應。