标签归档XNA

WPF好看的进度久实现浅谈(效果小类似VS2012装置界面)

  为了界面友好,一般的操作时较丰富时,都用充实速度修提醒。由于WPF自带的快条其实有些好看,而且从不啥视觉效果。后来,装VS2012时时,发现安装过程被速长长的效益是,于是上网查了资料。学习了ModernUI(开源之),地址:https://github.com/firstfloorsoftware/mui。

  后来,做了品尝写了只Demo,效果不错。另外,专门录制了tif文件,方便大家张成效。废话不多说,先出示力量:

如出一辙、效果亮

  A、VS2012安装界面图;

         个人档案 1

  B、个人品味Demo效果图: 

       个人档案 2

次、实现认证

  1、下载MUI相关代码或者dll个人档案文件;

  2、工程中引入该dll,并引入其资源文件;

<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.xaml" />
                <ResourceDictionary Source="/FirstFloor.ModernUI;component/Assets/ModernUI.Light.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

  3、在需要展示速度漫长之页面,加入控件(其实还是WPF控件,只是MUI扩展了其样式而已);

<Label Margin="280,169,0,0" Style="{StaticResource BackGroundContentText}" x:Name="lblMainState" HorizontalAlignment="Left" VerticalAlignment="Top">正在启动:</Label>
        <ProgressBar Margin="280,200,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="500" Minimum="0" x:Name="ProgressControlRealValue" Maximum="1"  Value="0.1" Height="16" IsIndeterminate="False"/>
        <Label Margin="280,212,0,0" Style="{StaticResource BackGroundContentText}" x:Name="lblProcess" HorizontalAlignment="Left" VerticalAlignment="Top">正在加载地图数据...</Label>
        <ProgressBar Margin="280,250,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"  Minimum="0" x:Name="ProgressControl"  Width="500" Maximum="2" Height="16" IsIndeterminate="True" />

  4、后台实现,由于要基于情况更新速度文字和进度长长的之价。所以,这里以了异步BackgroundWorker(具体可以网上查相关材料);

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

namespace Monitor.Class
{
    /// <summary>
    /// 异步操作
    /// </summary>
    public class CWorker
    {
        /// <summary>
        /// 对象
        /// </summary>
        private BackgroundWorker backgroundWorker;

        /// <summary>
        /// 后台执行的操作
        /// </summary>
        public Action BackgroundWork { get; set; }

        /// <summary>
        /// 后台任务执行完毕后事件
        /// </summary>
        public event EventHandler<BackgroundWorkerEventArgs> BackgroundWorkerCompleted;

        private BackgroundWorkerEventArgs _eventArgs;//异常参数

        /// <summary>
        /// 构造
        /// </summary>
        public CWorker()
        {
            _eventArgs = new BackgroundWorkerEventArgs();
            backgroundWorker = new BackgroundWorker();
            backgroundWorker.WorkerReportsProgress = true;
            backgroundWorker.WorkerSupportsCancellation = true;
            backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
            backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        }

        /// <summary>
        /// 开始工作
        /// </summary>
        public void BegionWork()
        {
            if (backgroundWorker.IsBusy)
                return;
            backgroundWorker.RunWorkerAsync();
        }

        /// <summary>
        /// 工作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            if (BackgroundWork != null)
            {
                try
                {
                    BackgroundWork();
                }
                catch (Exception ex)
                {
                    _eventArgs.BackGroundException = ex;
                }
            }
        }

        /// <summary>
        /// 完成
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (this.BackgroundWorkerCompleted != null)
            {
                this.BackgroundWorkerCompleted(null, _eventArgs);
            }
        }
    }

    /// <summary>
    /// 事件
    /// </summary>
    public class BackgroundWorkerEventArgs : EventArgs
    {
        /// <summary>
        /// 后台程序运行时抛出的异常
        /// </summary>
        public Exception BackGroundException { get; set; }
    }
}

namespace Monitor
{
    /// <summary>
    /// Splash.xaml 的交互逻辑
    /// </summary>
    public partial class Splash : Window
    {
        MainWindow m_MainWindow = null;//主窗口
        CWorker m_Work = null;//任务

        public Splash()
        {
            InitializeComponent();
            m_MainWindow = new MainWindow();//创建主窗口对象
            m_Work = new CWorker();
            m_Work.BackgroundWork = this.ProcessDo;
            m_Work.BackgroundWorkerCompleted += new EventHandler<BackgroundWorkerEventArgs>(m_Work_BackgroundWorkerCompleted);
        }

        /// <summary>
        /// 进度提示
        /// </summary>
        public void ProcessDo()
        {
            m_MainWindow.InitData(this);
        }

        /// <summary>
        /// 移动
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            this.DragMove();
        }

        /// <summary>
        /// 窗口加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            m_Work.BegionWork();
        }

        /// <summary>
        /// 执行完成
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void m_Work_BackgroundWorkerCompleted(object sender, BackgroundWorkerEventArgs e)
        {
            m_MainWindow.Show();
            this.Close();
        }

        /// <summary>
        /// 赋值
        /// </summary>
        /// <param name="text"></param>
        private delegate void SetProcessLabelDelegate(string text, double processValue);
        public void SetProcessValue(string text, double processValue)
        {
            if (!Dispatcher.CheckAccess())
            {
                Dispatcher.Invoke(DispatcherPriority.Send, new SetProcessLabelDelegate(SetProcessValue), text, processValue);
                return;
            }
            this.lblProcess.Content = text;
            this.ProgressControlRealValue.Value = processValue;
        }
    }
}

 

澳门新葡亰官网WPF基础——Application

一、Application介绍

WPF中的Application对象用来开展一些大局的所作所为和操作,并且每个 Domain (应用程序域)中只且只生一个 Application 实例存在。WPF Application默认由片片段组成 : App.xaml 和 App.xaml.cs,这生接触类似于 Asp.Net WebForm,将概念和行事代码相分离。

微软把WPF中不时以的职能还封闭装于 Application 类中了。 Application 类具体产生以下职能: 

  • 钉住应用程序的生存期并与之相。 
  • 觅和拍卖命令执行参数。 
  • 检测及应未经处理的大。 
  • 共享应用程序范围的特性和资源。 
  • 治本独立应用程序中的窗口。 
  • 跟以及管理导航。 

二、Applicaion应用

1、在Visual Studio 2015遭到创造一个“WPF应用程序”,使用App.xaml文件定义启动应用程序。

路面临的每个WPF窗口(xaml),包含2个公文:xaml和xaml.cs

澳门新葡亰官网 1

品类文件(WpfApplication.csproj)中起对应的描述节点:<Page>和<Compile>,而<ApplicationDefinition>节点有的话只能有一个,用来定义启动项。

  <ItemGroup>
    <ApplicationDefinition Include="App.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </ApplicationDefinition>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <Page Include="MainWindow.xaml">
      <Generator>MSBuild:Compile</Generator>
      <SubType>Designer</SubType>
    </Page>
    <Compile Include="MainWindow.xaml.cs">
      <DependentUpon>MainWindow.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
  </ItemGroup>

2、也得以友善定义一个Main方法来贯彻WPF应用程序的开行。

率先步:在“解决方案资源管理器”中选中App.xaml文件,右键“从种类遭到清除”。

这会儿,Visual Studio自动会改变WPF项目文件(WpfApplication.csproj),去丢了<ItemGroup>中的<ApplicationDefinition>节点和<Compile>节点

<ItemGroup>
    <ApplicationDefinition Include="App.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </ApplicationDefinition>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
</ItemGroup>

苟后又如果拿App.xaml文件“包括于路遭到”来作WPF应用启动,F5运转时见面报错误“不分包适合吃入口点的静态‘Main’方法”。这个似是而非是由于Visual
Studio把路文件(*.csproj)中原源动生成的app.xaml相关的定义进行了修改(上面都证实)。

添加App.xaml进来后,项目文件(*.csproj)自动会转移如下代码:

  <ItemGroup>
    <Page Include="App.xaml">
      <SubType>Designer</SubType>
      <Generator>MSBuild:Compile</Generator>
    </Page>
    <Compile Include="App.xaml.cs">
      <DependentUpon>App.xaml</DependentUpon>
    </Compile>
  </ItemGroup>

首先截代码中App.xaml在项目文件中用ApplicationDefinition标签定义。第二段落代码中App.xaml在品种文件里用Page标签定义,这种概念是指App.xaml只是一个页面而已。因此,只待拿品种文件中将App.xaml的安排由Page修改成ApplicationDefinition即可。

次步:现在中添加一个新类,类名为App.cs。

足描绘副以下三种植办法启动WPF。 

    class App
    {
        [STAThread]
        static void Main()
        {
            f1();
        }
        static void f1()
        {
            // 定义Application对象作为整个应用程序入口
            Application app = new Application();
            MainWindow win = new MainWindow();
            //ShutdownMode选项,注意这个设置必须要写在app.Run()方法之前
            app.ShutdownMode = ShutdownMode.OnMainWindowClose; //非必须
            //调用Run方法
            app.Run(win);
        }
        static void f2()
        {
            // 定义Application对象作为整个应用程序入口  
            Application app = new Application();
            MainWindow win = new MainWindow();
            //是必须的,否则无法显示窗体  
            win.Show();
            //指定Application对象的MainWindow属性为启动窗体,然后调用无参数的Run方法  
            app.MainWindow = win;
            app.Run();
        }
        static void f3()
        {
            // 定义Application对象作为整个应用程序入口  
            Application app = new Application();
            // 通过Url的方式启动
            app.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
            app.Run();
        }
    }

老三、WPF应用程序的关闭

WPF应用程序的关只有当应用程序的 Shutdown
方法给调用时,应用程序才停下运作。 ShutDown
是隐式或显式发生,可以经过点名 ShutdownMode 的属于性值来进展设置。

计同:如上面写在代码里

方式二:写在App.xaml里

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication1"
             StartupUri="MainWindow.xaml" ShutdownMode="OnExplicitShutdown">
    <Application.Resources>

    </Application.Resources>
</Application>

季、Application对象事件

1、第一种植办法,在App.xaml文件添加事件,如Activated事件(当应用程序成为前台应用程序时触发)

这个方法也可以在Visual Studio(ide)中之App.xaml属性窗口(按F4)中设置。

<Application x:Class="WpfApplication1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication1"
             StartupUri="MainWindow.xaml" ShutdownMode="OnExplicitShutdown" Activated="Application_Activated">
    <Application.Resources>

    </Application.Resources>
</Application>

于App.xaml.cs文件之代码如下:

namespace WpfApplication1
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        private void Application_Activated(object sender, EventArgs e)
        {

        }
    }
}

2、第二种办法,定义一个App类写Main方法及其余事件相当。

namespace WpfApplication1
{
    class App
    {
        [STAThread]
        static void Main()
        {
            f1();
        }
        static void f1()
        {
            // 定义Application对象作为整个应用程序入口
            Application app = new Application();
            MainWindow win = new MainWindow();
            //ShutdownMode选项,注意这个设置必须要写在app.Run()方法之前
            app.ShutdownMode = ShutdownMode.OnMainWindowClose;
            //调用Run方法
            app.Run(win);
            app.Activated += App_Activated;
        }
        static void App_Activated(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }
    }
}

五、WPF澳门新葡亰官网应用程序生存周期

WPF应用程序的生命周期与执行各个,用MSDN上之一致摆放图片进行求证。

澳门新葡亰官网 2

Continue…

网站地图xml地图