WPF 项目实践


WPF介绍

    WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了界面设计和服务代码的分离。
    同时它提供了全新的多媒体交互用户图形界面。与早期的GDI+/GDI不同。WPF是基于DirectX引擎的,支持GPU硬件加速。高级别的线程绘制可以提高使用者的体验。


实战知识点

netframework4.7.2
Dapper(A high performance Micro-ORM supporting SQL Server, MySQL, Sqlite, SqlCE, Firebird etc..)
Panuon.UI.Silver(A beautiful wpf ui control library.)
Microsoft Visual Studio Installer Projects


获取项目前端页面,用于主界面点击切换

1
2
3
4
5
6
7
8
9
10
//构造 _partialViewDic
_partialViewDic = new Dictionary<string, Type>();
var assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.FullName.StartsWith("jjkcsoft"));

assembly.GetTypes().Where(
x => !x.Namespace.IsNullOrEmpty()&&x.Namespace.Equals("jjkcsoft.PartialViews") && x.IsSubclassOf(typeof(UserControl))

).ToList().ForEach(x => _partialViewDic.Add(x.Name.Remove(x.Name.Length - 4), x));
//切换页面
ContentControl.Content = Activator.CreateInstance(_partialViewDic[tag]);

机器码设计(多种硬件组合信息)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
GetHardWareInfo("Win32_Processor", "ProcessorId");
GetHardWareInfo("Win32_BIOS", "SerialNumber");
GetHardWareInfo("Win32_BaseBoard", "SerialNumber");
private static string GetHardWareInfo(string typePath, string key)
{
try
{
ManagementClass managementClass = new ManagementClass(typePath);
ManagementObjectCollection mn = managementClass.GetInstances();
PropertyDataCollection properties = managementClass.Properties;
foreach (PropertyData property in properties)
{
if (property.Name == key)
{
foreach (ManagementObject m in mn)
{
return m.Properties[property.Name].Value.ToString();
}
}

}
}
catch (Exception ex)
{
}
return string.Empty;
}

Resource配置

  • 引入Panuon.UI.Silver

  • 引入自定义Style

1
2
3
4
5
6
7
8
//resource配置(ui、style)
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Panuon.UI.Silver;component/Control.xaml" />
<ResourceDictionary Source="pack://application:,,,/jjkcsoft;component/Resources/Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
//xaml使用
xmlns:pu="clr-namespace:Panuon.UI.Silver;assembly=Panuon.UI.Silver"
Style="{StaticResource MainWindow}"

自定义DataGrid单元格样式

  • 时间类型的单元格
  • 下拉列表单元格
  • 多行表头
  • CheckBox单元格
1
2
3
4
5
6
7
8
//时间类型单元格
<DataTemplate x:Key="DateTemplate" >
<TextBlock Text="{Binding sj, StringFormat={}{0: yyyy年MM月dd日}}" MinWidth="100"/>
</DataTemplate>
<!--DataTemplate for the Published Date column when in edit mode. -->
<DataTemplate x:Key="EditingDateTemplate">
<DatePicker SelectedDate="{Binding sj}" />
</DataTemplate>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//单元格下拉自定义
<ObjectDataProvider x:Key="kms" ObjectType="{x:Type local:KmService}" MethodName="Getkms">
</ObjectDataProvider>
<DataTemplate x:Key="EdComTemplate" >
<ComboBox
Height="30" MinWidth="80"
pu:ComboBoxHelper.CornerRadius="2"
pu:ComboBoxHelper.DropDownCornerRadius="2"
pu:ComboBoxHelper.DropDownPadding="0,5"
ItemsSource="{Binding Source={StaticResource kms}}"
DisplayMemberPath="mc"
SelectedValuePath="dm"
SelectedValue="{Binding kmbh, UpdateSourceTrigger=PropertyChanged}">
</ComboBox>
</DataTemplate>
<DataTemplate x:Key="ComTemplate" >
<TextBlock Text="{Binding kmbh}" MinWidth="100" />
</DataTemplate>
<DataGridTemplateColumn Header="费用科目" CellTemplate="{StaticResource ComTemplate}" CellEditingTemplate="{StaticResource EdComTemplate}" Width="100"/>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//多行表头
<Style x:Key="JdStyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid x:Name="Root">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid
Grid.Column="0"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="50"/>

</Grid.ColumnDefinitions>
<ContentPresenter
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="3"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="方向"/>
<Rectangle
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="3"
VerticalAlignment="Stretch" Height="1"
Fill="#C0C0C0"
Visibility="Visible"/>
<ContentPresenter
Grid.Row="2"
Grid.Column="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="借"/>
<Rectangle
Grid.Row="2"
Grid.Column="1"
Width="1"
VerticalAlignment="Stretch"
Fill="#ccc"
Visibility="Visible"/>
<ContentPresenter
Grid.Row="2"
Grid.Column="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="贷"/>


</Grid>
<Rectangle
Grid.Column="1"
Width="1"
VerticalAlignment="Stretch"
Fill="#ccc"
Visibility="Visible"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//checkbox单元格  
<DataGridTemplateColumn HeaderStyle="{StaticResource JdStyle}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<CheckBox Width="50" Margin="-10,0,0,0" x:Name="jf"
IsChecked="{Binding jf,Converter={StaticResource jdfconvert}, UpdateSourceTrigger=PropertyChanged}" />
<Rectangle Width="1" Fill="#C0C0C0" MinHeight="32"/>
<CheckBox Width="40" Margin="0,0,0,0"
IsChecked="{Binding jf,Converter={StaticResource jfdconvert}, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//自定义转换器 (转换数据库0/1 到 false/true 用于CheckBox)
public class JdfConvert : IValueConverter
{
//当值从绑定源传播给绑定目标时,调用方法Convert
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value.ToString() == "1" ? true : false;
}
//当值从绑定目标传播给绑定源时,调用此方法ConvertBack
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{

return (bool)value ? "1" : "0";

}
}

Dapper使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
private void Button_Click_1(object sender, RoutedEventArgs e)
{
var p = dg.SelectedItem as Zzfzz;
var x = xm.SelectedItem as jjkcsoft.Models.Xm;
var x1 = nd.SelectedItem as jjkcsoft.Models.Nd;
var pzh = "";
var zy = "";
var kmbh = "";
double dfje = 0;
double jfje = 0;
double ye = 0;
DateTime v_kssj, v_jssj;

if (p == null)
{
var result = MessageBoxX.Show("请选择要更新的行", "Warning", Application.Current.MainWindow, MessageBoxButton.OK, new MessageBoxXConfigurations()
{
MessageBoxIcon = MessageBoxIcon.Warning,
ButtonBrush = "#F1C825".ToColor().ToBrush(),
});
return;
}
using (var conn = DbHelper.getCon())
{
int count = conn.Query<int>("select * from TAB where id=@id", new { id = p.id }).FirstOrDefault();
int gs = conn.Query<int>("select count(1) from TAB where xmbh=@xmbh and kmbh=@kmbh and nd=@nd", new { xmbh = x.xmbh ,kmbh=p.kmbh ,nd=x1.nd}).FirstOrDefault();
gs = gs + 1;

switch (p.kmbh)
{
case "8.1":
kmbh = p.kmbh;
v_kssj = p.sj.AddDays(1 - p.sj.Day);
v_jssj = p.sj.AddDays(1 - p.sj.Day).AddMonths(1).AddDays(-1);
dfje = conn.Query<double>("select sum(jejf) from TAB where xmbh=@xmbh and kmbh not in ('8.1','8.2','8.3') and nd=@nd and sj>=@kssj and sj<=@jssj", new { xmbh = x.xmbh, nd = x1.nd, kssj = v_kssj, jssj = v_jssj }).FirstOrDefault();
pzh = "结-" + p.sj.ToString("MM") + gs.ToString().PadLeft(2, '0');
break;
case "8.2":
kmbh = p.kmbh;
v_kssj = p.sj.AddDays(1 - p.sj.Day);
v_jssj = p.sj.AddDays(1 - p.sj.Day).AddMonths(1).AddDays(-1);
jfje = conn.Query<double>("select sum(jejf) from TAB where xmbh=@xmbh and kmbh not in ('8.1','8.2','8.3') and nd=@nd and sj>=@kssj and sj<=@jssj", new { xmbh = x.xmbh, nd = x1.nd, kssj = v_kssj, jssj = v_jssj }).FirstOrDefault();
dfje = conn.Query<double>("select sum(jedf) from TAB where xmbh=@xmbh and kmbh not in ('8.1','8.2','8.3') and nd=@nd and sj>=@kssj and sj<=@jssj", new { xmbh = x.xmbh, nd = x1.nd, kssj = v_kssj, jssj = v_jssj }).FirstOrDefault();
zy = "本月合计";
break;
case "8.3":
kmbh = p.kmbh;

v_kssj = DateTime.Parse(p.sj.ToString("yyyy-01-01"));
v_jssj=DateTime.Parse(p.sj.ToString("yyyy-01-01")).AddYears(1).AddDays(-1);
jfje = conn.Query<double>("select sum(jejf) from TAB where xmbh=@xmbh and kmbh not in ('8.1','8.2','8.3') and nd=@nd and sj>=@kssj and sj<=@jssj", new { xmbh = x.xmbh, nd = x1.nd, kssj = v_kssj, jssj = v_jssj }).FirstOrDefault();
dfje = conn.Query<double>("select sum(jedf) from TAB where xmbh=@xmbh and kmbh not in ('8.1','8.2','8.3') and nd=@nd and sj>=@kssj and sj<=@jssj", new { xmbh = x.xmbh, nd = x1.nd, kssj = v_kssj, jssj = v_jssj }).FirstOrDefault();
zy = "本年累计";
break;
default:
pzh = p.kmbh + "-" + p.sj.ToString("MM") + gs.ToString().PadLeft(2, '0');
zy = p.zy;
kmbh = p.kmbh;
dfje = p.jedf;
jfje = p.jejf;
ye = p.ye;
break;
}
if (count == 0)
{
conn.Execute("insert into TAB(c1,c2,c3) values(@c1,@c2,@c3)", new
{c1=c1,c2=c2,c3=c3
});
}
else
{

conn.Execute("update TAB set c1=@c1,c2=@c2 where id=@id", new
{
{c1=c1,c2=c2,c3=c3
});
}
var result = MessageBoxX.Show("保存成功", "Success", Application.Current.MainWindow, MessageBoxButton.OK, new MessageBoxXConfigurations()
{
MessageBoxIcon = MessageBoxIcon.Success,
ButtonBrush = "#75CD43".ToColor().ToBrush(),
});
}
}

项目部分页面