WPF自定义控件与样式(12)
WPF知识点--自定义Button(ControlTemplate控件模板)
WPF知识点--⾃定义Button(ControlTemplate控件模板)ControlTemplate是⼀种控件模板,可以通过它⾃定义⼀个模板来替换掉控件的默认模板以便打造个性化的控件。
ControlTemplate包含两个重要的属性:
VisualTree该模板的视觉树,⽤来描述控件的外观。
Triggers触发器列表,⾥⾯包含⼀些触发器Trigger,我们可以定制这个触发器列表来使控件对外界的刺激发⽣反应,⽐如⿏标经过时⽂本变成粗体等。
⽰例:
<Window.Resources>
<Style TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<!-- 定义视觉树 -->
<Grid>
<!-- 绘制外圆 -->
<Ellipse x:Name="ellipse"
Width="100"
Height="100"
Stroke="#FF6347">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.443,1.22">
<LinearGradientBrush.RelativeTransform>
<TransformGroup>
WPF实现自定义样式的MessageBox
WPF实现自定义样式的MessageBox
WPF中的MessageBox是一个常用的提示框控件,用于显示简单的信息和接收用户输入。然而,MessageBox的样式是由系统默认的样式决定的,并不能很好地满足个性化的需求。为了实现自定义样式的MessageBox,我们可以通过自定义控件的方式来实现。
首先,我们创建一个名为CustomMessageBox的自定义控件,继承自Window类,用于实现自定义样式的MessageBox。在CustomMessageBox类中,我们可以定义自己想要的样式和布局。
接下来,我们需要定义CustomMessageBox的显示方法,以及相关的属性和事件。在CustomMessageBox类中添加如下代码:
```csharp
public class CustomMessageBox : Window
public static readonly DependencyProperty MessageProperty = DependencyProperty.Register("Message", typeof(string), typeof(CustomMessageBox));
public string Message
get { return (string)GetValue(MessageProperty); }
set { SetValue(MessageProperty, value); }
}
WindowStyle = WindowStyle.None;
WPF自定义TabControl控件样式
WPF⾃定义TabControl控件样式
⼀、前⾔
程序中经常会⽤到TabControl控件,默认的控件样式很普通。⽽且样式或功能不⼀定符合我们的要求。⽐如:我们需要TabControl的标题能够居中、或平均分布;或者我们希望TabControl的
标题能够进⾏关闭。要实现这些功能我们需要对TabControl的样式进⾏定义。
⼆、实现TabControl的标题平均分布
默认的TabControl标题是使⽤TabPanel容器包含的。要想实现TabControl标题头平均分布,需要把TabPanel替换成UniformGrid;
替换后的TabControl样式如下:
<Style x:Key="TabControlStyle" TargetType="{x:Type TabControl}">
<Setter Property="Padding" Value="2"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Background" Value="White"/>
<Setter Property="BorderBrush" Value="#FFACACAC"/>
<Setter Property="BorderThickness" Value="1"/>
WPF自定义ItemsControl控件
该控件叫 Sum m ar y, 主要是一些汇总信息的显示,有几个地方用,之前都是分散到各个XA ML 文件里,不统一。
本人WPF新手,对XAML了解不多,做这个软件基本上都是用CM,界面布局用Avalon Dock。由于缺乏相关经验,又没有一个能问得上的人指导,写这个控件费了我很长时间(啥时有空啥时动动)。
之前主要做一些功能方面的,没有心思美化界面,现在虽然还有很多功能没写,但是基本上够自己用了,放下心思来做一些界面上的东西,要不然何苦选择WPF?
先看一下图:
该Custo m Cont rol 由4部分组成:
大标题,小标题,值及Detail。
虽然细分这么多,但实质上还是一个列表类的控件,所以选择继承自 Item sC ontro l.
做这个控件的时候,遇到了一些详细的问题不知道怎么解决,Google/Bing 都没有找到我要了解的,Baidu更不用提了,漫天的转载,Copy.
1, 类似 Com boB ox 的 Displa yMemb erPat h 如何弄?
既然都自定控件了,当然是想让它适用不同场景,不能局限于某一个实体类,最好是能像Displa yMemb erPat h ValueM em ber Path这样的属性。
这里,我定义了:
Item Ti tlePa thPro perty及 Item Va luePa thPro perty来处理。
WPF使用Winform自定义控件
WPF使⽤Winform⾃定义控件
在WPF的⽤户控件中使⽤Winfrom⾃定义控件的过程:
1、添加引⽤
WindowsFormsIntegration.dll
System.Windows.Forms.dll
2、在要使⽤WinForm控件的WPF窗体的XAML⽂件中添加如下内容:
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
如下图所⽰:
3、在WPF的容器控件内如StackPanel内⾸先要添加WinForm控件的宿主容器,⽤于衔接WPF和WinForm,
对应XAML如下:
说明:<wfi:WindowsFormsHost></wfi:WindowsFormsHost>即为WinForm控件的宿主容器,每⼀个宿主容器只能放⼀个WinForm控件,如下例,放了三个WinForm控件,分别放在三个宿主容器⾥⾯,该容器可以设置属性来调整⼤⼩和布局
注意:如上我添加的WinForm控件如在指定其Name时,必须加前缀x:,如添加Lable时<wf:Label x:Name="wpfLabel" Text="我是WPF中的WinForm控件” />,否则后台代码⽆法访问。
<local:UserControl1 Name="Header" Width="319" Height="30"></local:UserControl1>这个为Winform⾃定义控件。
WPF自定义控件与样式-自定义按钮(Button)
WPF⾃定义控件与样式-⾃定义按钮(Button)
⼀、前⾔
程序界⾯上的按钮多种多样,常⽤的就这⼏种:普通按钮、图标按钮、⽂字按钮、图⽚⽂字混合按钮。本⽂章记录了不同样式类型的按钮实现⽅法。
⼆、固定样式的按钮
固定样式的按钮⼀般在临时使⽤时或程序的样式⽐较固定时才会使⽤,按钮整体样式不需要做⼤的改动。
2.1 普通按钮-扁平化风格
先看效果:
定义Button的样式,详见代码:
<Style x:Key="BtnInfoStyle" TargetType="Button">
<Setter Property="Width" Value="70"/>
<Setter Property="Height" Value="25"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Background" Value="#43a9c7"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels <TextBlock Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
WPF自定义控件与样式(13)-自定义窗体Window自适应内容大小消息框MessageBox
WPF⾃定义控件与样式(13)-⾃定义窗体Window⾃适应内容⼤⼩消息框
MessageBox
⼀.前⾔
申明:WPF⾃定义控件与样式是⼀个系列⽂章,前后是有些关联的,但⼤多是按照由简到繁的顺序逐步发布的等,若有不明⽩的地⽅可以参考本系列前⾯的⽂章,⽂末附有部分⽂章链接。
本⽂主要内容:
⾃定义Window窗体样式;
基于⾃定义窗体实现⾃定义MessageBox消息提⽰框;
⼆.⾃定义Window窗体样式
⾃定义的Window窗体效果:
因为WPF默认的窗体⽐较简陋,⼤都需要⾃⼰实现Window窗体样式效果,基本思路很简单:
第⼀步:⼲掉默认样式:WindowStyle = WindowStyle.None;
第⼆步:设置窗体透明:AllowsTransparency = true;
第三步:设置⾃⼰的窗体样式;
这样从外观样式上可以满⾜,但做为窗体该具备的基本功能还没有,需要另外来实现了:
窗体Icon、标题栏(可以通过样式实现);
窗体的基本按钮:最⼩化、最⼤化、关闭按钮;
窗体的⿏标拖动;
好像Win8、Win10的功能吧,窗体拖动到桌⾯边缘⾃动最⼤化、还原;
⿏标调整窗⼝⼤⼩;
双击标题栏最⼤化、还原;
上⾯的功能在本⽂中,⼀部分是⾃定义实现的,还有⼀部分是⽤了⼀个开源库(Microsoft.Windows.Shell)⽤于实现窗体⼤⼩、拖放等窗体基本功
能,Microsoft.Windows.Shell⽂件下载:。
进⼊正题,⾃定义窗体WindowBase的后台C#代码:
///<summary>
在WPF中自定义控件
承,打造 CustomControl 时其会为从 System.Windows.Controls.Control 继承.但实际情况下,也许我们从他们的衍生类别开始继承会得到更多的好处(更好的重 用已 有的逻辑),比如你的控件拥有更多的类似于 Button 的某些特性,那么从 Button 开始继承就比从 Control 继承少写很多代码.
1,为控件添加属性(依赖属性,DependencyProperty) 正如下面的代码所示:
public static readonly DependencyProperty TimeProperty = DependencyProperty.Register("Time", typeof(DateTime), typeof(ClockUserCtrl), new FrameworkPropertyMetadata(DateTime.Now,new PropertyChangedCallback(TimePropertyChangedCallback)));
wpf常用控件和使用方式
文章标题:WPF常用控件和使用方式
导言: WPF(Windows Presentation Foundation)是微软开发的一种用于创建Windows桌面应用程序的技术框架。它提供了一套强大而灵活的控件库,使开发者能够构建现代、交互式的用户界面。本文将深入探讨WPF常用控件及其使用方式,帮助读者对WPF控件有更全面、深刻和灵活的理解。
一、Button 控件 Button(按钮)是WPF中最常用的控件之一,用于触发用户交互操作。它具有多种样式和自定义选项,使开发者能够创建各种不同外观和行为的按钮。在本部分,我们将重点介绍Button控件的几个重要属性、样式和事件。
1.1 属性 - Content:按钮显示的文本或图像。 - Command:定义一个命令,按钮将执行该命令。 - IsEnabled:指示按钮是否可用。 - CommandParameter:命令的参数。 - Background:按钮的背景色。 - Foreground:按钮的前景色。
1.2 样式 WPF提供了多种样式来美化按钮的外观,同时也支持开发者自定义按钮样式。在本节,我们将介绍几个常用的按钮样式,如默认样式、悬浮样式和按下样式,并提供样式代码示例。
1.3 事件按钮可以响应多种事件,如Click事件、MouseEnter事件和MouseLeave 事件。开发者可以通过这些事件实现按钮的行为控制和交互操作。我们将演示如何使用这些事件来处理用户操作。
二、TextBox 控件 TextBox(文本框)是用于输入和编辑文本的常用控件。它提供了多种属性和事件,使开发者能够对文本输入进行控制和验证。在本节,我们将重点介绍TextBox控件的几个关键属性、样式和事件。
WPF自定义TreeView控件样式,仿QQ联系人列表
WPF⾃定义TreeView控件样式,仿QQ联系⼈列表
⼀、前⾔
TreeView控件在项⽬中使⽤⽐较频繁,普通的TreeView并不能满⾜我们的需求。因此我们需要滴对TreeView进⾏改造。下⾯的内容将介绍仿QQ联系⼈TreeView样式及TreeView数据绑定⽅
法。
⼆、TreeView仿QQ联系⼈列表
准确的说不是仿QQ联系⼈列表,这个TreeView样式作为组织架构来使⽤更好。废话不多说,先看效果:
2.1、基本思路
像这种联系⼈列表⼀般涉及到多层级数据,⽽且有很多数据是需要动态更新的,如果通过⼿动⼀条条增加数据反⽽更复杂,⽽且不⽅便。因此为了绑定数据⽅便我们使⽤分层模板HierarchicalDataTemplate。
分层模板中存在两种样式,⼀种是分组样式,⼀种是⼈员样式。不管是分组还是⼈员绑定的都是对象,这样我们在对象中添加⼀个属性来辨别是否为分组-IsGrouping。
默认的TreeView控件四周会有边距,因此需要设置下TreeView的样式。另外⿏标经过和⿏标选中的背景⾊需要变化,因此还需要设置TreeViewItem的样式。
根据思路,我们需要设置三个样式,TreeView样式,TreeViewItem样式,HierarchicalDataTemplate分层模板样式。另外为了⾃动计算下⼀级的边距,我们需要添加⼀个转换器
IndentConverter。还需要⼀个转换器需要将布尔类型的IsGrouping转换为Visibility,还需要⼀个转换器来对Visibility取反。
wpf controltemplate和contenttemplate
wpf controltemplate和
contenttemplate
在WPF(Windows Presentation Foundation)中,`ControlTemplate`和`ContentTemplate`是两个重要的概念,用于自定义控件的外观和内容。
`ControlTemplate`用于定义控件的整体外观和行为。它可以定义控件的视觉元素,如背景、边框、文本等,并定义控件的交互行为,如鼠标点击、键盘输入等。通过使用`ControlTemplate`,可以为现有的控件提供自定义的外观,或者创建全新的自定义控件。
例如,假设有一个按钮控件,默认的外观可能不符合应用程序的设计需求。可以创建一个自定义的`ControlTemplate`,重新定义按钮的外观,例如更改背景颜色、添加图标等。这样,在应用程序中使用这个自定义的按钮控件时,它将显示自定义的外观。
`ContentTemplate`则用于定义控件的内容。它指定了控件内部显示的内容,通常是数据或子元素。通过使用`ContentTemplate`,可以根据不同的数据或条件,动态地显示不同的内容。
例如,有一个列表框控件,需要根据不同的项显示不同的样式。可以为每个项定义一个自定义的`DataTemplate`,并在`ContentTemplate`中引用这些`DataTemplate`。这样,当添加项到列表框时,它们将根据相应的`DataTemplate`进行显示。
总的来说,`ControlTemplate`用于定义控件的外观和行为,而`ContentTemplate`用于定义控件的内容显示。两者结合使用,可以实现高度自定义的控件和动态的内容显示。
[WPF自定义控件]简单的表单布局控件
[WPF ⾃定义控件]简单的表单布局控件
1. WPF
布局⼀个表单
在WPF 中布局表单⼀直都很传统,例如使⽤上⾯的XAML ,它通过Grid 布局⼀个表单。这样出来的结果整整齐齐,看上去没什么问题,但当系统⾥有⼏⼗个表单页以后需要统⼀将标签改为上对齐,或者标签和控件中加⼀个:号等需求都会难倒开发⼈员。⼀个好的做法是使⽤某些控件库提供的表单控件;如果不想引⼊⼀个这么“重”的东西,可以⾃⼰定义⼀个简单的表单控件。
这篇⽂章介绍⼀个简单的⽤于布局表单的Form 控件,虽然是⼀个很⽼的⽅案,但我很喜欢这个控件,不仅因为它简单实⽤,⽽且是⼀个很好的结合了ItemsControl 、ContentControl 、附加属性的教学例⼦。
Form 是⼀个⾃定义的ItemsControl ,部分代码可以参考这篇⽂章。
2. ⼀个古⽼的⽅法
即使抛开验证信息、确认取消这些更⾼级的需求(表单的其它功能真的很多很多,但这篇⽂章只谈论布局),表单布局仍是个⼗分复杂的⼯作。幸好⼗年前ScottGu 分享过⼀个,很有参考价值:
Karl Shifflett has another great WPF blog post that covers a cool way to perform flexible form layout for LOB scenarios.<Grid Width="400" HorizontalAlignment="Center" VerticalAlignment="Center">
wpf中的样式与模板
wpf中的样式与模板
1.WPF样式
类似于Web应⽤程序中的CSS,在WPF中可以为控件定义统⼀的样式(Style)。样式属于资源的⼀种,例如为Button定义统⼀的背景颜⾊和字体:
<Window.Resources>
<Style TargetType="Button">
<Setter Property="Background" Value="Yellow" />
</Style>
</Window.Resources>
<StackPanel>
<Button>Button A</Button>
</StackPanel>
在Style中定义的属性及值,影响到Window中的所有类型为Button的控件的样式
这种样式,类似于CSS中的类型选择器,为某种类型定义样式。
此外还可以在Style中加⼊x:Key属性,做为特定的样式(注意,这种也需要定义TargetType);
在第⼀个样式的基础上创建⼀个新样式可以达到这⼀⽬的,如下所⽰:<Window.Resources>
<Style x:Key="BigFontButtonStyle">
<Setter Property="Control.FontFamily" Value="Times New Roman" />
<Setter Property="Control.FontSize" Value="18" />
WPF自定义控件与样式(9)-树控件TreeView与菜单Menu-ContextMenu
WPF⾃定义控件与样式(9)-树控件TreeView与菜单Menu-
ContextMenu
⼀.前⾔
申明:WPF⾃定义控件与样式是⼀个系列⽂章,前后是有些关联的,但⼤多是按照由简到繁的顺序逐步发布的等,若有不明⽩的地⽅可以参考本系列前⾯的⽂章,⽂末附有部分⽂章链接。
本⽂主要内容:
菜单Menu的⾃定义样式;
右键菜单ContextMenu的⾃定义样式;
树控件TreeView的⾃定义样式,及右键菜单实现。
⼆.菜单Menu的⾃定义样式
⾃定义菜单样式的效果图:
Menu和ContextMenu样式本⾝很简单,他们最主要的部分就是MenuItem,MenuItem中包含的内容⽐较多,如图标、选中状态、⼆级菜单、⼆级菜单的指针、快捷键等。使⽤了字体图标定义菜单项MenuItem样式代码:
<!--菜单项MenuItem样式FIconMenuItem-->
<Style x:Key="FIconMenuItem" TargetType="{x:Type MenuItem}">
<Setter Property="BorderBrush" Value="{StaticResource MenuBorderBrush}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Background" Value="{StaticResource MenuBackground}"/>
WPF自定义漂亮的按钮样式
WPF⾃定义漂亮的按钮样式⾸先打开 Microsoft Visual Studio 2008 ,新建⼀个WPF项⽬,在上⾯随便放⼏个按钮:
然后给各个按钮设置不同的背景颜⾊:
设置好之后就是这样啦:
然后我们就开始在 App.xaml ⽂件中定义按钮样式了:
定义的样式代码如下:
看了先不要头⼤,我们先看看最终效果,然后回过头来再解释代码:
这是常规样式
这个是⿏标移到上⾯时的样式
这个是⿏标点击时的样式
还有就是按钮失效时的样式
效果还算不错吧,下⾯来讲解代码喽,头晕的同学可以现在就收拾东西回家了哈。
我们先来看这个命名为“back”的 Border 元素,它⽤它的 Background 属性充当了整个按钮的背景⾊。
其背景所⽤的是⼀个渐变笔刷,起始值和中间值都是引⽤的按钮本⾝的背景⾊,就是我们之前设置过的颜⾊啦,终⽌值是⽩⾊,这样通过位置调整,我们可以在按钮最下部产⽣⼀些向⽩⾊的过度⾊彩效果。
它的 BitmapEffect 属性我们设置了⼀个⼤⼩为 0 的外发光效果,平常是看不见这效果的,在这⾥预先设置好,是为了在⿏标移⼊、按下时实现动画使⽤。
再来看看这个命名为“fore”的 Border 元素,它实现的是按钮的边框和⾼亮反光效果,我为它设置了⼀个半透明的⿊⾊1像素边框,使得这个边框的⾊彩可以和背景⾊混合起来。
它的背景同样采⽤的渐变笔刷,起始值和终⽌值的位置⼏乎贴在⼀起,从⽽形成⽐较鲜明的反光度对⽐。
ContentPresenter 元素⽤于呈现按钮原本的内容,对于按钮来说就是按钮上的⽂字了,当然也可能会存在图⽚或其它东西。
wpf中,一个简单的自定义treeview
wpf中,⼀个简单的⾃定义treeview
⾸先创建⼀个⾃定义控件,在⾥⾯定义好treeview的样式,将本来的三⾓形的图标变为加号的图标,并且添加节点之间的连线。
<UserControl x:Class="TreeViewEx.myTreeView"
xmlns="/winfx/2006/xaml/presentation"
xmlns:x="/winfx/2006/xaml"
xmlns:mc="/markup-compatibility/2006"
xmlns:d="/expression/blend/2008"
xmlns:i="clr-namespace:TreeViewEx"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<i:TreeViewLineConverter x:Key="LineConverter"/>
<!-- Toggle Button -->
<Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
<Setter Property="Focusable" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WPF自定义控件与样式(12)
WPF自定义控件与样式(12)-缩略图ThumbnailImage /gif动画图/图片列表
时间2015-12-01 09:21:00
博客园-原创精华区原文
/anding/p/5009120.html
主题
WPF
Bitmap一.前言
申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接。
本文主要针对WPF项目开发中图片的各种使用问题,经过总结,把一些经验分享一下。内容包括:
WPF常用图像数据源ImageSource的创建;
自定义缩略图控件ThumbnailImage,支持网络图片、大图片、图片异步加载等特性;
动态图片gif播放控件;
图片列表样式,支持大数据量的虚拟化;
二.WPF常用图像数据源ImageSource的创建
<Image Source="../Images/qq.png"></Image>
这是一个普通Image控件的使用,Source的数据类型是ImageSource,在XAML中可以使用文件绝对路径或相对路径,ImageSource是一个抽象类,我们一般使用BitmapSource、BitmapImage等。
但在实际项目中,有各种各样的需求,比如:从Bitmap
创建ImageSource对象;
从数据流byte[]创建ImageSource对象;
从System.Drawing.Image创建ImageSource对象;
从一个大图片文件创建一个指定大小的ImageSource对
象;
2.1 从System.Drawing.Image创建指定大小ImageSource 对象
/// <summary>
/// 使用System.Drawing.Image创建WPF使用的ImageSource类型缩略图(不放大小图)
/// </summary>
/// <param
name="sourceImage">System.Drawing.Image 对象
</param>
/// <param name="width">指定宽度</param> /// <param name="height">指定高度</param> public static ImageSource CreateImageSourceThumbnia(System.Drawing.Image sourceImage, double width, double height)
{
if (sourceImage == null) return null;
double rw = width / sourceImage.Width;
double rh = height / sourceImage.Height;
var aspect = (float)Math.Min(rw, rh);
int w = sourceImage.Width, h = sourceImage.Height;
if (aspect < 1)
{
w = (int)Math.Round(sourceImage.Width * aspect); h = (int)Math.Round(sourceImage.Height * aspect);
}
Bitmap sourceBmp = new Bitmap(sourceImage, w, h); IntPtr hBitmap = sourceBmp.GetHbitmap(); BitmapSource bitmapSource =
Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions()); bitmapSource.Freeze();
System.Utility.Win32.Win32.DeleteObject(hBitmap); sourceImage.Dispose();
sourceBmp.Dispose();
return bitmapSource;
}
2.2 从一个大图片文件创建一个指定大小的ImageSource对象
/// <summary>
/// 创建WPF使用的ImageSource类型缩略图(不放大小图)
/// </summary>
/// <param name="fileName">本地图片路径
</param>
/// <param name="width">指定宽度</param>
/// <param name="height">指定高度</param> public static ImageSource CreateImageSourceThumbnia(string fileName, double width, double height)
{
System.Drawing.Image sourceImage =
System.Drawing.Image.FromFile(fileName);
double rw = width / sourceImage.Width;
double rh = height / sourceImage.Height;
var aspect = (float)Math.Min(rw, rh);
int w = sourceImage.Width, h = sourceImage.Height;
if (aspect < 1)
{
w = (int)Math.Round(sourceImage.Width * aspect); h = (int)Math.Round(sourceImage.Height * aspect);
}