标签归档WPF

澳门新葡亰官网怎么样展示超大图像

1:做了图像展示的都知,我们的图纸大部分且是缩减了之,大部分呢JPEG PNG
BMP其中BMP格式是点阵形式,当图片翻译到内存之后凭杀没减了都见面化为BMP格式放上内存,在是进程遭到,图片数据会几倍的附加,就随JPEG,一摆1M尺寸的JPEG格式的图样,翻译到内存可能就是见面化7倍增左右,也即是7M会放在电脑内存里面,如果显示平摆100M的JPEG图片,放上内存的口舌也许就是见面变成1G,好了而是1G底图样为,你的电脑内存还够用啊,可以,兄弟你得说自己电脑配置很高
达到16G内存条,,如果自身要是给你展示同一摆设4G之图样也,注意压缩了的,翻译到内存将近28G,你说自家可购买一个28G之内存条,可以
,兄弟你大有钱,哈哈哈,,如果你莫要是这样,这篇稿子好无用看了,跪拜土豪。那要是,我不怕想用一个2G的外存条显示就张减少了还有4G底图样咋办,并且我还惦记死成当下张图也,就如,我因此显微镜拍一布置切片,或虽然一个资料的纹理结构,那么尽管可能一个片只来几乎个CM,但是显微镜人家分辨率高呀,看的仔细呀,用显微镜不纵想将图片放大个几千倍显嘛,好了,问题来了,这样显微照相机或要拍上千摆放图纸,最后拼接成一布置大图,然后在电脑上显示,所有医生得以以处理器面前指指点点,是免是殊便利,但是,同志,问题而来了,电脑内存不够,你为转变不了这般可怜之图,生成的进程吧是在电脑内存里面的, 
 好了,废话不多说了,看下的演示吧。

1:准备等同摆设54889×80315图片,当然不必然多人数会起诸如此类深之图片,因为未知晓这种技术吧,也没法生成这么可怜之图形。

如图:

澳门新葡亰官网 1

当即张图片大小是54889×80315
这数据量大概发生多要命啊,我算了瞬间,大概是4.2041G,细心的网友或会见小心到,为什么来得的大小才发399M
呢,,哈哈哈,,这就算是任何一个技能了,想放的意中人等,会在延续之章中,解密。

2:现在若我们大家都生了当时张图片了,下面我们纪念展示这张图纸:首先,都见面想到的,我因此常规的浏览器试一下嘛,我们不怕先用微软从带的图纸浏览器,不要小瞧了之windows图片查看器,亲测,他大智能,也甚高效,千万不要以为他是单稍程序,有时候自己真可以打开我之图片,即使本人的图纸有我计划的特有之数据结构和减少形式,PS都不克开拓自己的图形,这家伙可以打开,所以当此自己要么那个钦佩这个图浏览器。

澳门新葡亰官网 2

安,哈哈哈,电脑内存不足够吧,当然是浏览器还挂,也止是傻大粗的野蛮式显示就张图,当然内存不够用了。我于自我爱人8G内存的电脑上吧试试了,一样死机!!!显示都展示不了了,还谈什么产生就张图。

3:但是呢,我于是自己写的软件,就可打开就张图纸,当然之前我也知晓怎么产生就张图,这是一个完的流程;我之软件打开的功能是:

澳门新葡亰官网 3

来平等摆放全局的图像效果:如下:

 

澳门新葡亰官网 4

其实把图纸使劲缩小显示,图片的全局意义就是长成这样。其实效果跟而出示同一张小图没什么区别,流畅度,还有你得开标记,什么的,,,,这些还是多多益善别的浏览器都抱有的叠加功能,但是当这些附加功能实现过程也是怪痛苦的,为什么吧,就是因马上是一律布置超大图片,太好了,显示机制不同等,所以整传统艺术还得颠覆一下。

 

写的好辛苦,这个类型,做了有限年,就是以好这软件,整个经过为于痛苦,因为自己是形而上学出身,现在尚于该校朗诵研究生,写代码的水平赶不达专业出身,这项技艺整个完整流程,我打算慢慢写下去,从您哪产生同样张目前为止最可怜的图纸,让你图像拼接突破计算机限制,让您什么样展示出,如何运动,如何缩放,如何做标记等等,,太多了内容,,完整工程文件,包括编译好之库文件,我都发,压缩包解压就可以直接用,我于是WPF编写的,其实WPF就与C#差不多,其实他少凡是兄弟。代码数量超过好几万。可是花费了自吓特别的脑子。有趣味之对象可百度一晃Aperio,MOTIC这些公司,Aperio这个软件是暨外的表配套出售的,据说一高仪器好几百万,功能就是是发微镜扫描一个片,然后打开浏览切片,主要是便利医生进行切片检查,同时减轻医生的工作量,要明白,没有这个表的话,医生但要是为此眼一个个扣押片,成千上万的片这是要累够呛医生呀!!!眼睛瞅瞎!!!Aperio他们举行的扫视一布置切片就差一点秒,然后就输入到电脑,用软件显示出来,这个软件基本作用,也尽管是自家这软件之功效。。。。。。。

成套软件涉及到之技艺产生,TIFF图像技术,四叉树,虚拟显示技术,虚拟容器技术,内存映射文件技术,图像金字塔技术等等剩下的就是什么,做标记澳门新葡亰官网,XML文档管理,缩略图显示,UI布局等等 
真的多。

起趣味之情侣可关注后续的篇章,有得之软件之可沟通自己,我的信箱nanshanyi@sjtu.edu.cn,可以协商。今天虽形容及马上。。。。。。

 

[WPF]本地化入门

1. 前言

WPF的本地化是个要命宽泛的功力,我开过之WPF程序大部分且落实了本地化(不管最后闹没发生下)。通常本地化有以下几点需求:

  • 当先后启动时冲CultureInfo.CurrentUICulture还是配备起显示对诺语言的UI。
  • 在程序运行时方可动态切换UI语言(无需再开程序)。
  • 制造对应不同语言的安装包。
  • 透过下载语言包实现多种语言的本地化。

其中只有首先碰是必备之。
次接触最为好吗足以实现,很多辰光切换语言才以省有专业术语在英语受到的原稿是啊,或者临时打印个英文报表,平时下要用汉语,用户不思量为这点又开程序。
老三点和季接触则很普遍,但自己有史以来没实现了,毕竟文字资源(有时还闹微量图)占用的空间不见面太多,大部分WPF程序都并未大到需要考虑安装包大小,所有语言的资源总体于包上一个安装包就是可以了。

WPF本地化技术十分成熟,也生几种植方案,微软以MSDN给出了详尽的介绍WPF
全球化与本地化概述.aspx),还有一样客古老的文档WPF
Localization
Guidance,整整66页,里面详细介绍了各种WPF本地化的建制。

本文仅介绍两栽实现上述第1、2点需要的方案。

2. 下资源词典

2.1 基本原理

本着WPF开发者来说,资源词典肯定不会见生。不过当资源词典里下string可能比较少。

<Window x:Class="LocalizationDemoWpf.Window1"
        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:LocalizationDemoWpf"
        mc:Ignorable="d" 
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <system:String x:Key="Chinese">中文</system:String>
    </Window.Resources>
    <Grid>
        <TextBlock Text="{DynamicResource Chinese}"/>
    </Grid>
</Window>

倘以上代码所示,在XAML中定义string资源要事先引入xmlns:system="clr-namespace:System;assembly=mscorlib"命名空间,之后重新利用DynamicResource引用这资源。不要以StaticResource,这样没法完成动态切换语言。

如若利用资源词典实现本地化,需要先创造所欲语言的xaml,我以DEMO中创造了en-us.xaml和zh-cn.xaml两单资源词典,里面的含的资源布局同样(指数量和Key一样):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
                    xmlns:system="clr-namespace:System;assembly=mscorlib"
                    xmlns:local="clr-namespace:LocalizationDemoWpf">
    <system:String x:Key="SwitchLanguage">切换语言</system:String>
    <system:String x:Key="Chinese">中文</system:String>
    <system:String x:Key="English">英文</system:String>
    <system:String x:Key="Username">用户名</system:String>
    <system:String x:Key="Sex">性别</system:String>
    <system:String x:Key="Address">地址</system:String>
    <SolidColorBrush x:Key="Background" Color="#88FF0000"/>
</ResourceDictionary>

于次启动时因CultureInfo.CurrentUICulture抑或部署起选相应之资源词典,使用MergedDictionaries的主意加载到程序的资源集合中:

var culture = ReadCultureFromConfig();
var cultureInfo = new System.Globalization.CultureInfo(culture);
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = cultureInfo;


ResourceDictionary dictionary = new ResourceDictionary { Source = new Uri($@"Resources\{culture}.xaml", UriKind.RelativeOrAbsolute) };
Application.Current.Resources.MergedDictionaries[0] = dictionary;

如此本地化的功力就是水到渠成了。

2.2 动态切换语言

实在上述方案就落实了动态切换语言。
XAML资源的援原则是邻近原则,这个附近不仅指VisualTree上的前后,还指日达到之跟前。后补加进资源词典的资源用替换之前的同名资源。使用DynamicResource而无是StaticResource,就是为着在资源被轮换时能实时变更UI的显得。

2.3 设计时支持

VisualStudio的XAML设计时支持针对开发WPF程序要,对本地化来说,设计时支持重点包含3有的:

  • 在编写XAML时得获得资源的智能感知
  • 来完的统筹视图
  • 以不同语言中切换

动用资源词典实现本地化,只需要于App.xaml中联合对应之资源词典即可获得完整的筹划时支持。

<Application x:Class="LocalizationDemoWpf.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:LocalizationDemoWpf"
             xmlns:resource="clr-namespace:LocalizationDemoWpf.Resource;assembly=LocalizationDemoWpf.Resource"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/LocalizationDemoWpf;component/Resources/zh-cn.xaml"/>
                <!--<ResourceDictionary Source="/LocalizationDemoWpf;component/Resources/en-us.xaml"/>-->
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

图片 1

即时段XAML只是为了增强设计时体验,没有吗会透过编译。

2.4 在代码里看资源

每当代码中访问资源比较累,需要明白资源的名目,而且尚未智能感知,如果资源词典由第三正在类库提供就见面再次累。

var message = TryFindResource("SwitchLanguage") as string;
if (string.IsNullOrWhiteSpace(message) == false)
    MessageBox.Show(message);

2.5 在代码里替换资源

private void OnReplaceString(object sender, RoutedEventArgs e)
{
    _totalReplace++;
    string content = "Replace " + _totalReplace;
    Resources["StringToReplace"] = content;
}

只要齐所示,在代码中替换资源异常简便,不过这种概括也带了资源不可控的题材。

2.6 在程序集以内共享资源

地方来取了,在获得第三着类库中有资源充分劳动,不仅如此,连抱第三正在类库中的资源词典名称都十分麻烦。我提议于类库中定义如下的接近,可以于开发者提供部分便于:

public static class Resources
{
    public static Uri EnglishResourceUri { get; } =
        new Uri("/LocalizationDemoWpf.Resource;component/Resource.en-us.xaml", UriKind.RelativeOrAbsolute);

    public static Uri ChineseResourceUri { get; } =
        new Uri("/LocalizationDemoWpf.Resource;component/Resource.zh-cn.xaml", UriKind.RelativeOrAbsolute);
}

2.7 总结

资源词典是促成本地化的等同栽特别广泛的方法,它产生如下优点:

  • 粗略好用,而且容易了解。
  • XAML语法简单。
  • 资源得以是除了string以外的型,如SolidColorBrush。

而这种方法的缺点也多:

  • 难以管理,一旦资源过多,重名、互相覆盖、智能感知列表过长齐题材将大幅度地震慑开发,就连保不同语言里资源词典里之资源数量一样都格外辛苦。
  • 在程序集里难以共享,引用很粗略,但出于无智能感知将非常不便用,而且不同程序集以内的资源同名更难跟踪。

除本条之外,在动态切换语言上还存有的问题。下面这段XAML就无奈完成动态切换语言:

<DataGrid Grid.Row="1" Margin="5">
    <DataGrid.Columns>
        <DataGridTextColumn Header="{DynamicResource Username}"/>
        <DataGridTextColumn Header="{DynamicResource Sex}"/>
        <DataGridTextColumn Header="{DynamicResource Address}" Width="*"/>
    </DataGrid.Columns>
</DataGrid>

在DataGridColumn的Header上举行动态切换语言,需要写成DataTemplate的艺术:

<DataGrid Grid.Row="2" Margin="5">
    <DataGrid.Columns>
        <DataGridTextColumn >
            <DataGridTextColumn.HeaderTemplate>
                <DataTemplate >
                    <TextBlock Text="{DynamicResource Username}"/
                </DataTemplate>
            </DataGridTextColumn.HeaderTemplate>
        </DataGridTextColumn>
        <DataGridTextColumn >
            <DataGridTextColumn.HeaderTemplate>
                <DataTemplate >
                    <TextBlock Text="{DynamicResource Sex}"/>
                </DataTemplate>
            </DataGridTextColumn.HeaderTemplate>
        </DataGridTextColumn>
        <DataGridTextColumn Width="*">
            <DataGridTextColumn.HeaderTemplate>
                <DataTemplate >
                    <TextBlock Text="{DynamicResource Address}"/>
                </DataTemplate>
            </DataGridTextColumn.HeaderTemplate>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

3. 采取Resx资源文件

3.1 基本原理

比从资源词典,我还欣赏用Resx资源文件,不过这种措施语法复杂一些,而且为产生为数不少粗问题。
在VisualStudio中创造后缀名为resx的资源文件并开拓,可当偏下UI编辑资源文件之价(将做客修饰符改为public用起来方便把):
图片 2

在改资源文件的值后PublicResXFileCodeGenerator将电动创建对应之类并为每一个键值添加如下代码:

/// <summary>
///   查找类似 Address 的本地化字符串。
/// </summary>
public static string Address {
    get {
        return ResourceManager.GetString("Address", resourceCulture);
    }
}

然后拿此资源文件复制粘贴一客,将称改变也“原名+.+对应的语言+.resx”的格式,并且将中的值翻译成对许语言如下:
图片 3

每当UI上使用x:Static绑定到相应的资源:

<DataGridTextColumn Header="{x:Static local:Labels.Username}"/>

如此这般中心的本地化就成功了。很多控件库都是采用这种方式召开本地化。除了字符串,resx资源文件还支持除字符串以外的资源,如图、音频等。
图片 4

可是方案只是兑现了无以复加中心的本地化,而且极端深之题目是光支持直接利用字符串,不支持TypeConverter,甚至为非支持除字符串以外的别XAML内置类型.aspx)(即Boolea,Char,Decimal,Single,Double,Int16,Int32,Int64,TimeSpan,Uri,Byte,Array等门类)。例如使用Label.resx中称之为也Background值为
#880000FF 的字符串为Grid.Background实现本地化:

Labels.designer.resx

/// <summary>
///   查找类似 #880000FF 的本地化字符串。
/// </summary>
public static string Background {
    get {
        return ResourceManager.GetString("Background", resourceCulture);
    }
}

MainWindow.xaml

<Grid  Background="{x:Static local:Labels.Background}"/>

运作时报错:ArgumentException:
“#88FF0000”不是性“Background”的有效值。

诸如此类资源文件之实用性大打折扣。当然,这个方案为无支持动态切换语言。

3.2 动态切换语言

在Silverlight.aspx)中曾经无了x:Static的绑定方式,改也使Binding实现本地化,这样虽然语法复杂一些,但更加实用。WPF当然也可行使这种艺术。

第一, 创建一个类似包装资源文件生成的接近(在这Demo中是Labels):

public class ApplicationResources
{
    public ApplicationResources()
    {
        Labels = new Labels();
    }

    public Labels Labels { get; set; }
}

接下来于App.xaml中拿以此看似作为资源丰富到资源集合中,为了以后使用的语法简单些,我平常将Key取得好粗略:

<Application x:Class="LocalizationDemoWpfUsingResource.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:LocalizationDemoWpfUsingResource"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <local:ApplicationResources x:Key="R"  />
    </Application.Resources>
</Application>

最后在XAML中如此绑定:

<DataGridTextColumn Header="{Binding Labels.Username, Source={StaticResource R}}"/>

如此这般语法复杂一些,但也发众多利:

  • 支持TypeConverter,这样虽得用除String以外的旁门类。
  • 支撑Binding的任何力量,如IValueConverter。

辛苦的凡,WPF似乎不是颇欣赏这种艺术,VisualStudio会提示这种不当,毕竟资源文件被的特性都是static属性,不是实例成员。幸运的凡编译一潮这种不当提示就会熄灭。
图片 5

将调用方式转吗Binding以后便可以实现动态切换语言了。由于UI通过Binding获取资源文件的情,可以经INotifyPropertyChanged通知UI更新。将ApplicationResources
改造一下:

public class ApplicationResources : INotifyPropertyChanged
{
    public static ApplicationResources Current { get; private set; }

    public ApplicationResources()
    {
        Current = this;
        Labels = new Labels();
    }

    public Labels Labels { get; set; }



    public event PropertyChangedEventHandler PropertyChanged;

    public  void ChangeCulture(System.Globalization.CultureInfo cultureInfo)
    {
        Thread.CurrentThread.CurrentUICulture = cultureInfo;
        Thread.CurrentThread.CurrentCulture = cultureInfo;
        Labels.Culture = cultureInfo;

        if (Current != null)
            Current.RaiseProoertyChanged();
    }

    public void RaiseProoertyChanged()
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(""));
    }
}

现行可以简单地切换语言了。

var culture = ReadCultureFromConfig();
var cultureInfo = new System.Globalization.CultureInfo(culture);
ApplicationResources.Current.ChangeCulture(cultureInfo);

3.3 设计时支持

贯彻本地化的一个深烦的工作是何许以设计视图看到各种语言下的成效。在运用资源词典的方案遭凡经过以App.xaml中集合对应的资源词典:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/LocalizationDemoWpf;component/Resources/zh-cn.xaml"/>
    <!--<ResourceDictionary Source="/LocalizationDemoWpf;component/Resources/en-us.xaml"/>-->
</ResourceDictionary.MergedDictionaries>

每当资源文件的方案面临,需要以ApplicationResources中上加一个性质:

private string _language;

/// <summary>
/// 获取或设置 Language 的值
/// </summary>
public string Language
{
    get { return _language; }
    set
    {
        if (_language == value)
            return;

        _language = value;
        var cultureInfo = new CultureInfo(value);
        Thread.CurrentThread.CurrentUICulture = cultureInfo;
        Thread.CurrentThread.CurrentCulture = cultureInfo;
        Labels.Culture = cultureInfo;

        RaiseProoertyChanged();
    }
}

之后于App.xaml中便好透过转移之特性来改变规划时之UI的语言,在VS2017遭受连编译都非需不畏足以更改规划视图的语言。

<local:ApplicationResources x:Key="R"  Language="zh-CN"/>

图片 6

3.4 在代码里看资源

每当代码里拜访资源文件之资源非常简:

MessageBox.Show(Labels.SwitchLanguage);

3.5 在代码里替换资源

资源文件要促成者需求就一些都无好玩了,至少自己从没在实质上工作吃做了。最可怜的难题是资源文件生成的好像中之性质是静态属性,而且只有getter方法:

public static string StringToReplace {
    get {
        return ResourceManager.GetString("StringToReplace", resourceCulture);
    }
}

我们呢足以创建一个差生类,强行替换对应之属性:

public class ExtendLabels : Labels
{
    /// <summary>
    /// 获取或设置 StringToReplace 的值
    /// </summary>
    public new string StringToReplace { get; set; }
}

然后替换ApplicationResources中之Labels,并且触发PropertyChanged。不过这样见面刷新所有UI上之字符串等资源,只为替换一个字符资源代价来硌十分,幸好一般的话并无会见尽耗费性能。

private void OnReplaceString(object sender, RoutedEventArgs e)
{
    _totalReplace++;
    string content = Labels.StringToReplace + " " + _totalReplace;
    if (_extendLabels == null)
        _extendLabels = new ExtendLabels();

    _extendLabels.StringToReplace = content;
    ApplicationResources.Current.Labels = _extendLabels;
    ApplicationResources.Current.RaiseProoertyChanged();
}

3.6 在先后集以内共享资源

只有待将资源文件之造访修饰符改为public,无需任何操作就可便宜地于程序集里共享资源。
图片 7

3.7 管理资源文件

正如打资源词典,资源文件还有一个老大十分之优势就是便于管理。Demo中特生一个名字Labels的资源文件,实际项目遭到好依照功能或模块分别树相应之资源文件,解决了资源词典重名、互相覆盖、智能感知列表过长等问题。另外我推荐用VS的恢弘程序ResXManager管理所有资源文件。
图片 8

它可以在一个UI里管理有语言的资源文件,极大地好了资源文件之采用。
图片 9

3.8 ReSharper支持

针对Resx资源文件,ReSharper也提供了不错的支撑。

当得吗某个资源修改Key时,可以以“资源文件名称”+”.”+”Key”来全局替换,通常这样都足足放心。ReSharper更进一步,它提供了重命名功能。假设要以Labels的资源English重名为耶Englishs,可以事先在Labels.Designer.cs重命名,然后采用“Apply
rename refactoring”选项:
图片 10

这有援,包括XAML都已利用新的称谓:
图片 11

而最后以亟需协调下手在资源文件编辑器中改Key。

除了,如果在XAML中行使了错的Key,ReSharper也发生不当提示:
图片 12

当某些场合,ReShaper还只是运“Move To Resource”功能:
图片 13
图片 14

3.9 总结

动Resx资源文件贯彻地方化有如下优点:

  • 资源管理有利于。
  • 好当代码中利用。
  • 爱当先后集以内共享。
  • 支持TypeConverter,这样就是可以用除String以外的外品类。
  • 支持Binding的另力量,如IValueConverter。
  • 兼容性好,Silverlight及之后的XAML技术都可采取。
  • 老三正在工具支持。
  • 支撑图片、音频等资源。

短如下:

  • XAML语法相对复杂。
  • 非克直接利用于TypeConverter不支持之档次,例如LinearGradientBrush。

虽然非克一直支持LinearGradientBrush,但也不是完全无章程,只是复杂了成千上万,如分别针对LinearGradientBrush的GradientStop做本地化:

<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
    <GradientStop Color="Black" Offset="0"/>
    <GradientStop Color="{Binding Source={StaticResource R},Path=Labels.Background}" Offset="1"/>
</LinearGradientBrush>

4. 结语

旋即首文章就介绍了本地化的入门知识,其它还有许多本地化的要,如验证信息遭受之本地化没有干。另外,本地化还足以使用x:Uid方式或者WPFLocalizeExtension抵措施贯彻,这里就是无详细介绍。
WPF
全球化以及本地化概述.aspx)里来介绍一些本地化的最佳做法,如UI上该采取相对布局要未绝对布局、字体选择相当,这里不再累赘。

要小心的是上述两种植方案都不适用于CLR属性,这为是干什么我一直强调UIElement的性最好是赖属性的由有。

使发错漏请指出。

5. 参考

WPF
全球化和本地化概述.aspx)
Silverlight
部署与本地化.aspx)
WPFLocalizationExtension
WPF Localization Guidance
XAML
Resources
CultureInfo
类.aspx)
Supported
languages

6. 源码

LocalizationDemo

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;
        }
    }
}

 

网站地图xml地图