.NET(C#):计算HttpWebResponse的下载速度
摘要: 当你通过HttpWebResponse.GetResponse()返回的Stream读取数据的时候,正确计算下载速度是一个小小的问题。你需要考虑到多种网络情况。 下面是几种我想到的错误的思路: 直接在每一次Read调用后,根据读取的字节数除以Read方法的时间:理论上讲,这种方法计算的结果应该是最精准的。但是通常HTTP接收数据都是一小块一小块的频繁的数据,所以Read会被非常频繁的调用,首先会造成速度被频繁得计算,这个倒是无所谓了,关键是由于计时器频繁重启,每次间隔很短,所以时间间断总是在短时间内频繁变化,造成速度过分灵敏,变化过快。当然在我实际做测试的时候,由于时间间隔太小...
阅读全文
.NET(C#):使用HttpWebRequest头中的Range下载文件片段
摘要: HTTP请求包头信息中有一个Range属性可以指定索取部分HTTP请求的文件。在.NET中则通过HttpWebRequest.AddRange方法来定义数据的范围。 当添加了Range属性的HTTP请求发送后,如果服务器支持该请求,也就是说支持部分数据提取(也是我们常说到的支持断点续传的下载,所谓断点续传的下载就是用一个Range属性来指定没有下载到的范围),那么服务器会返回Partial Co...
阅读全文
.NET(C#):将数据字节大小转换成易读的单位字符串
摘要: 计算机中数据大小一般以字节为单位,数据类型通常是long类型,转换成易读的单位字符串,比如1024字节就显示1KB。1024*1024字节则显示1MB…… Google中搜索了半天,在StackOverflow中找到一个好的答案: http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-...
阅读全文
WPF:使用DocumentPaginator手动将FlowDocument分页
摘要: 示例程序可以根据用户定义的大小,将一个文本文件分页显示。 这要得益于FlowDocument中的分页器(DocumentPaginator)。WPF中的FlowDocument,FixedDocument和FixedDocumentSequence都有自己的分页器。他们都继承与IDocumentPaginatorSource接口,这个借口则返回一个分页器对象DocumentPaginator。 FixedDocument和FixedDocumentSequence使用分页器很好理解,因为他们本身就要按固定页面大小显示。而FlowDocument虽然是流动的,但是某些控件...
阅读全文
WPF:FlowDocument中加入Canvas
摘要: 如果在FlowDocument中加入Canvas: <FlowDocumentScrollViewer> <FlowDocument> <BlockUIContainer> <Border BorderBrush="Navy" BorderThickness="1"> <Canvas> <Button Canvas.Left="20" Canvas.Top="40">A</Button> ...
阅读全文
WPF:一个估量最小大小的Canvas
摘要: 问题的由来: <StackPanel> <Canvas> <Button>A</Button> </Canvas> <Button>B</Button> </StackPanel> 结果只有Button(B)才会显示出来: 原因是默认Canvas的MeasureOverride返回一个空的Size对象(Width和Height都是0),这代表着Canvas的DesiredSize(UIElement.DesiredSize)是(0,0),说明C...
阅读全文
WPF:深层拷贝一个TextElement对象
摘要: 第一种方法就是通过XamlWriter和XamlReader,这个理解起来很容易,因为它们在XAML中都可以定义。代码: static T DeepCopy<T>(T textElement) where T : TextElement { var stream = new System.IO.MemoryStream(); System.Windows.Markup.XamlWriter.Save(textElement, stream); stream.S...
阅读全文
WPF:FixedDocument文档中的FixedPage
摘要: 首先可以通过FixedPage的Width和Height来定义页面的大小(FixedPage和PageContent类型都继承自FrameworkElement),单位可以是WPF默认的像素,还可以是厘米,英寸或磅。 <PageContent> <FixedPage Width="100" Height="100"/> </PageContent> <PageContent> <FixedPage Width="3.5cm" Height="1in"/>
阅读全文
WPF:RoutedUICommand和MenuItem
摘要: 把RoutedUICommand放在MenuItem上简直就是太方便了。菜单项的快捷键(MenuItem.InputGestureText属性)会自动显示,而且菜单项的显示文字(MenuItem.Header属性)是RoutedUICommand.Text而不是Name属性。而相比其他命令源(ICommandSource接口),Button类型和Hyperlink类型就没这么方便了。 比如...
阅读全文
WPF:不显示打印对话框(PrintDialog)直接打印
摘要: 为什么需要显示打印对话框,因为我们不知道用户要用哪个打印机和具体的打印选项,如果我们知道的话,那么就不需要显示这个对话框。 WPF中PrintDialog(在System.Windows.Controls命名空间内)储存用户选择的属性是PrintQueue和PrintTicket属性,分别代表用户选择的打印机和打印选项。 注意: 下面代码需要引用:System.Printing.dll 并且在代码上加入命名空间:using System.Printing; 获取当前系统的默认打印机可以通过LocalPrintServer.GetDefaultPrintQu...
阅读全文
WPF:将FlowDocument打印成多列的XPS文档
摘要: 注意:文章将使用Microsoft XPS Document Writer虚拟打印机打印XPS文档,该打印机在Windows Vista,7系统中默认安装。 最简单的方法就是用支持多列试图的控件,比如FlowDocumentReader和FlowDocumentPageViewer。 调节控件的宽度WPF会自动分列(如果宽度足够大的话),当然手动调节FlowDocumen...
阅读全文
WPF:打印出现:Value cannot be null. Parameter name: printQueue异常
摘要: 当我用PrintDialog下打印时,出现异常(ArgumentException):Value cannot be null. Parameter name: printQueue。 最终发现原来是我的Windows 7系统的Print Spooler系统服务没有开启。在控制面板的服务中手动开启Print Spooler服务就没有问题了: 开启后XPS打印机也出现了: :D
阅读全文
[我的软件]Mgen 博数 2.3
摘要: 一个全功能的图形化数学计算器。高二写的,最近把软件的个人信息更新了下,顺便发在博客上。软件仅供娱乐,没啥实际用途。 基于.NET Framework 2.0,C#,Windows Forms。 下载 天空软件站:http://www.skycn.com/soft/45726.html 我的SkyDrive存档:链接 截图: 多功能计算和化简: ...
阅读全文
WPF:处理标记为已处理的路由事件
摘要: 路由事件的RoutedEventArgs有一个Handled属性,当接收方将Handled属性设置为True时,该事件则被标记为已处理,事件源将不再发送事件。事实上,事件依然被发送,因为WPF中的很多核心部件都依靠路由事件在Visual Tree上转来转去。只不过已处理事件不会触发默认事件处理方法。本文则讨论怎样注册一个可以处理“已处理路由事件”的事件处理方法(EventHandler)。 第一种方法是UIElement.AddHandler。注意IInputElement接口定义了标准方法AddHandler: void AddHandler(RoutedEvent rout...
阅读全文
WPF:修改图像(BitmapSource类型)的元数据
摘要: 简而言之首先需要获取图像的元数据,接着通过设置BitmapFrame.Metadata属性,然后用BitmapEncoder保存图片。 这里有些细节需要注意,首先如果使用BitmapFrame.Create(BitmapSource)方法初始化BitmapFrame: BitmapFrame.Create(new BitmapImage(new Uri(@"C:\Users\Mgen\Desktop\a.jpg"))); 此时该BitmapFrame是不包含元数据的,Metadata属性会返回null。 因此获取图像元数据必须用BitmapDecoder,通过Bitm...
阅读全文
WPF:使用GifBitmapDecoder解析GIF动画文件
摘要: 感谢WPF的强大封装,这一切竟然3段代码就完成了。 比如我们常见到的那个兔子揉脸的GIF: 程序运行结果: 代码则是使用BitmapDecoder类型,针对GIF动画,则需要初始化它的子类GifBitmapDecoder。而BitmapDecoder得Frames属性则包含一系列的BitmapFrame。这个类型是BitmapDecoder(和BitmapEncoder)中用到的图像帧,继承自BitmapSource,因此本质上也是一种位图类型。 XAML: <ListBox Name="lbx"> <ListBox...
阅读全文
WPF:FlowDocument中的Floater位置问题
摘要: 首先Floater就像它名字的意思一样,一旦设置了,会紧紧贴在文档中,后面的元素不管是Inline的还是Block的,只要Floater的水平线上有空隙,都会向上移动(区别就是Block元素会换一行,而Inline元素直接叠加在上面元素的尾部)。 XAML: <Paragraph> 前前前前前前前前前前前前前前前前前 <Floater HorizontalAlignment="Left"> <Paragraph>Floater1</P...
阅读全文
WPF:理解TileBrush(ImageBrush,DrawingBrush和VisualBrush)
摘要: WPF中的TileBrush是DrawingBrush,ImageBrush和VisualBrush的基类。定义着这三种Brush的公共特性。本文以ImageBrush做示例,其他类型读者可以举一反三。 TileBrush的Stretch属性默认是Stretch,因此默认TileBrush的内容会拉伸到全部可用空间内: <ImageBrush ImageSource="/mgenx.jpg"/> 结果: 当然可以调成其他值,此时的TileBrush类似一个Image控件: <ImageBrush ImageSource="/mgenx.jpg&q
阅读全文
WPF:StatusBar控件中实现Windows Forms中的Spring属性
摘要: 在Windows Forms中,调整ToolStripStatusLabel的Spring属性可以把StatusStrip中的Label设置成拉伸(占用其他全部空间): 在WPF中,设置StatusBarItem的HorizontalContentAlignment为Stretch,可是这个只能设置最后一个项目: <StatusBar> <StatusBarItem> <Button>A</Button> </StatusBarItem> ...
阅读全文
WPF:在XBAP中捕获导航错误
摘要: 在普通WPF程序中本来是可以通过NavigationFailed事件的。(可以通过Application类,NavigationWindow类,NavigationService类,Frame类。它们都有NavigationService事件)。可以在XBAP中,这招貌似不能用。 比如随便弄了非法导航链接: <Hyperlink NavigateUri="httppppp://www.a.com">link</Hyperlink> 然后加上Application.NavigationFailed事件: protected override ...
阅读全文
[我的软件]Mgen 轻型任务管理器 1.5
摘要: 版本更新请参考:[我的软件]Mgen 轻型任务管理器 - 更新列表 软件详细介绍请参考:[我的软件]Mgen 轻型任务管理器 1.0 主界面: 下载地址 当前版本的程序和源代码下载 下载地址 注意:此为微软SkyDrive存档,请用浏览器直接下载,用某些下载工具可能无法下载 示例程序运行环境:.NET Framewo...
阅读全文
[我的软件]Mgen 轻型任务管理器 - 更新列表
摘要: 软件简介: 和Windows任务管理器相比,软件有如下优点: > 将Windows任务管理器应用程序和进程选项卡合二为一,方便用户快速强制结束任务。 > 支持多项任务的强制结束和关闭窗口操作。 > 一键强制结束所有未响应进程。 > 一键强制结束所有同名进程。 > 形象化显示CPU和进程信息。 > 显示进程图标和路径 > 快速显示当前系统CPU和内存信息。 …… 更多精彩请亲自体验! 更新列表: [我的软件]Mgen 轻型任务管理器 1.5 [我的软件]Mgen ...
阅读全文
WPF:详解创建Lookless自定义控件——文件选择控件
摘要: 目录 -1:控件演示和源代码下载 0. 准备工作 1. 继承Control类型 2. 添加依赖属性 3. 添加路由事件 4. 控件模板中的已命名对象 5. 对话框处理 6. 添加路由命令 7. 添加拖放支持 8. 定义默认控件模板 返回目录 -1:控件演示和源代码下载 文章将会创建一个Lookless控件:文件选择器(FileSelector) 使用起来非常简单,用控件的PredefinedExts属性指定支持的扩展名(第一个会作为...
阅读全文
WPF:使用RoutedPropertyChangedEventArgs和RoutedPropertyChangedEventHandler类型
摘要: 为了方便常见的针对属性值改变的路由事件,WPF提供了定义此类路由事件的辅助类型。分别是泛型RoutedPropertyChangedEventHandler委托来定义此类路由事件的委托类型。另一个类型是RoutedPropertyChangedEventArgs泛型类型来定义此类路由事件的自定义EventArgs。 它们的使用非常方便,泛型类型参数就是相应属性值的类型。另外RoutedPropertyChangedEventArgs还改写了RoutedEventArgs.InvokeEventHandler方法,这样执行更有效率。 比如定义一个路由事件IdChanged(代表I...
阅读全文
WPF:请记住改写路由事件RoutedEventArgs.InvokeEventHandler方法
摘要: 当你自定义一个路由事件的EventArgs,直接继承RoutedEventArgs,然后添加成员就OK了?不!记住改写RoutedEventArgs.InvokeEventHandler方法。这个方法是protected virtual。它的默认执行对于一个自定义的RoutedEventArgs派生类是很没效率的!在细说RoutedEventArgs.InvokeEventHandler默认执行之前,先说说为什么RoutedEventArgs.InvokeEventHandler方法很重要。原因很简单,因为WPF路由事件的运行将会调用RoutedEventArgs.InvokeEventHan
阅读全文
.NET(C#):很少被注意的Assembly.CreateQualifiedName和Type.ReflectionOnlyGetType方法
摘要: 不过两者都很好理解。 Assembly.CreateQualifiedName用来构建一个完整的类型路径,该路径包含程序集名称,这个路径可以用在Type.GetType静态方法中(或者后面要讲的Type.ReflectionOnlyGetType静态方法)。通常构建此类路径的时候,开发者直接通过字符串连接把类型的全名称和程序集的名称中间加一个逗号就可以了,不过还是有必要提一下.NET Framework中有这样的方法。 示例代码: namespace Mgen { class Program { class Nested...
阅读全文
WPF:处理程序的“未处理异常”
摘要: 我首先想到的是应用程序域AppDomain类型的UnhandledExceptionEventHandler,试了试才知道原来AppDomain.UnhandledExceptionEventHandler就是一个通知性质的事件,没有处理异常的功能,自然未处理异常还会是程序崩溃。它的UnhandledExceptionEventArgs中有两个属性:IsTerminating和ExceptionObject,分别代表程序是否在崩溃和引起崩溃的异常对象。 比如这段代码: static void Main(string[] args) { ...
阅读全文
.NET(C#):在KeyedCollection类型中加字典的TryGetValue方法
摘要: TryGetValue方法很常用,可以把“判断键存在”和“根据键取值”两步转化为一步,这样键的哈希值只计算一次,是很有效率的。但注意IDictionary接口并没有定义TryGetValue,而泛型接口IDictionary<T, V>定义了TryGetValue。而KeyedCollection类型却继承自类型Collection<T>,Collection<T>继承接口ICollection<T>。原因应该是KeyedCollection不仅仅是字典,还包含一个线性表吧。因此KeyedCollection默认是没有TryGetValue的。
阅读全文
[更新至V2]WPF:渐变显示和删除的装饰器(Adorner)
摘要: 可以渐变显示,隐藏或删除一个自定义装饰器元素,目标可以是任何UIElement。演示:比如界面上的TextBox:点击显示后,渐变出现自定义装饰器的内容:点击不显示,装饰器内容会渐变消失。删除功能也一样,只不过删除后内容不可以再次显示,因为装饰器已经在装饰层被删除了。原理很简单,可能唯一需要注意的是动画的添加,可以参考这篇文章: WPF:在装饰器(Adorner)中加入动画 V2更新(2012-01-28): 增加对进入和移除时间的分别控制。 修正状态变化。下载: V2源代码下载 下载地址 注意:此为微软SkyDrive存档,请用浏览器直接下载,用某些下载...
阅读全文
WPF:Timeline类型的From和To属性为null的时候
摘要: 当From为null时:自动读取依赖属性的当前值(Current Value)。 当To为null时:自动读取依赖属性的基值(Base Value)。 关于依赖属性的基值和当前值简单的说优先级是:当前值 > 动画设置值 > 基值。更多信息可以参考另一篇文章:WPF依赖属性的当前值(Current Value),基值(Base Value)和本地值(Local Value) 做一个小实验: 一个按钮,原始宽度是100。然后执行两个动画,第一个动画设置To为200。From没设置(保持null)。第二个动画From和To都没设置(保持null)。 下面这个动画运行起来是什么结...
阅读全文
[我的软件]Mgen 轻型任务管理器 1.0
摘要: 版本更新请参考:[我的软件]Mgen 轻型任务管理器 - 更新列表 目录 1. 软件信息 2. 特色功能 3. 技术实现 4. 已知问题 返回目录 1. 软件信息 名称 Mgen 轻型任务管理器 许可 免费,开放源代码 运行需求 Microsoft .NET Framework 3.5(Windows 7默认会有) 开发代号 ...
阅读全文
Mgen.BasicTask V2
摘要: 更新内容: 添加BasicTaskRequestState枚举专门指定当前请求状态。 删除部分BasicTaskState的请求状态,该功能由BasicTaskRequestState实现。 这样在任务有状态请求后,但是在任务等待唤醒之前,可以无限制改变任务请求状态,等到任务唤醒后,最后的请求状态会被应用。 比如在V1中,一个正在运行的任务,执行暂停命令后,任务状态称为请求暂停,此刻任务实际状态还是运行,但你无法停止任务,只有等请求暂停状态转到暂停,然后执行继续,状态再一次转到运行才可以执行停止命令。但在V2中,请求状态和实际状态是分开的,所以一个请求暂停状态的任务是可以立即改变...
阅读全文
WPF:使用附加属性记录ListBox/ListView选择信息
摘要: 使用我写的这个类型的附加属性可以在界面上快速记录ListBox/ListView的选择信息。 该类型名叫:ListCounter,有三个附加属性: ListBox:ListBox类型,指定目标ListBox或ListView。 Property:string类型,指定需要设置的当前对象的属性。 FormatString:string类型,可选(因为有默认值),指定格式字符串,其中{0}是全部元素个数,{1}是选择元素个数。 使用起来就很简单,比如: <ListBox Name="lbx" SelectionMode="Extended"/...
阅读全文
WPF:关于依赖属性的ValidateValueCallback,PropertyChangedCallback和CoerceValueCallback的执行顺序
摘要: 这三个回调对应依赖属性的验证过程,改变过程和强制转换过程。 测试环境:.NET 4.0 用于测试的依赖对象: class Dobj : DependencyObject { //依赖属性包装 public int MyProperty { get { return (int)GetValue(MyPropertyProperty); } set { SetValue(MyPropertyProperty, value); } ...
阅读全文
WPF:依赖属性的本地值和默认值
摘要: 推荐先读这篇文章:WPF依赖属性的当前值(Current Value),基值(Base Value)和本地值(Local Value) 依赖属性(Dependency Property)的默认值是注册依赖属性时,属性元数据制定的默认值参数。比如FrameworkPropertyMetadata类型的构造函数。默认值是依赖属性值优先级中最低的! 而依赖属性的本地值是由Dependen...
阅读全文
WPF:自定义XAML标记扩展时使用IProvideValueTarget获取目标对象信息
摘要: 自定义标记扩展时,改写MarkupExtension的ProvideValue方法中的唯一一个参数是IServiceProvider类型。这个IServiceProvider是在System命名空间内,并且是.NET 1.0就有的类型,用来返回针对一个对象的服务对象。而针对标记扩展的服务对象也有很多,这里有一个详细的列表:http://msdn.microsoft.com/zh-cn/library/system.windows.markup.markupextension.providevalue.aspx 不过最常见的就是IProvideValueTarget类型的服务。该类型有两...
阅读全文
Mgen.BasicTask V1
摘要: 更新: 请使用Mgen.BasicTask V2: http://www.cnblogs.com/mgen/archive/2012/01/04/2312234.html写了个小工程,名叫Mgen.BasicTask!。实现了简单的循环执行线程,并且支持暂停/继续,开始/停止功能。运行效果如下:界面中有三个独立的任务线程,你可以进行“开始”,“停止”,“暂停”和“继续”操作。 当前版本的程序和源代码下载 下载地址 注意:此为微软SkyDrive存档,请用浏览器直接下载,用某些下载工具可能无法下载 示例程序运行环境:.NET Framework 4.0 Client Pr...
阅读全文
WPF:动态删除资源效果
摘要: 很简单,手动删除ResourceDictionary.MergedDictionaries中的资源字典就可以了。 效果类似是这样: 首先XAML中资源引用要用DynamicResource标记扩展,因为静态的StaticResource资源引用在资源改变后不会更新的。然后在程序中加入资源字典: <Window.Resources> ...
阅读全文