ToB企服应用市场:ToB评测及商务社交产业平台

标题: 基于WPF重复造轮子,写一款数据库文档管理工具(一) [打印本页]

作者: 半亩花草    时间: 2022-9-4 16:50
标题: 基于WPF重复造轮子,写一款数据库文档管理工具(一)
项目背景

公司业务历史悠久且复杂,数据库的表更是多而繁杂,每次基于老业务做功能开发都需要去翻以前的表和业务代码。需要理解旧的表的用途以及包含的字段的含义,表少还好说,但是表一多这就很浪费时间,而且留下来的文档都是残缺不全,每次查一些表的含义都要捯饬很久。在网上搜索关于数据库文档管理工具搜到最多的就是Screw和DBCHM,一个是基于Java的工具、另一个则是bug很多,表一多就一直转圈圈进不去。所以自己就动手开发了这款SmartSQL的工具。

它是一款基于.Net 4.6.1、WPF开发的一款数据库文档管理,不仅支持多种数据库(SQLServer、MySQL、PostgreSQL、SQLite)表、视图、存储过程的查询管理,还支持对其进行导出成离线文档,支持的文档包括CHM、Word、Excel、PDF、HTML、Xml、Json、MarkDown等多种格式。
现在将它开源分享出来,供更多的小伙伴使用和参考学习(文末附开源地址)。
技术栈

HandyControl是一款非常优秀的WPF框架,做出来的页面都很漂亮,所以我们选择使用它。
Nuget中引用HandyControl:

一.菜单栏


然后我们要实现一个基于WPF边框上的菜单栏,刚好HandyControl中有这么一个菜单栏的控件,
下面就是实现菜单栏的方法:
`
  1. <hc:GlowWindow.NonClientAreaContent>
  2.     <StackPanel Height="29" Margin="25,0,0,0">
  3.         <Menu HorizontalAlignment="Left">
  4.             <MenuItem
  5.                 x:Name="SwitchMenu"
  6.                 Cursor="Hand"
  7.                 FontWeight="Bold"
  8.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  9.                 Header="选择连接">
  10.                 <MenuItem.Icon>
  11.                     <Path
  12.                         Data="{StaticResource DownGeometry}"
  13.                         Fill="{DynamicResource DarkPrimaryBrush}"
  14.                         Stretch="Uniform" />
  15.                 </MenuItem.Icon>
  16.                 <MenuItem.ItemTemplate>
  17.                     <HierarchicalDataTemplate>
  18.                         <MenuItem
  19.                             Width="160"
  20.                             Margin="0"
  21.                             Padding="0"
  22.                             HorizontalAlignment="Left"
  23.                             VerticalAlignment="Stretch"
  24.                             Click="SwitchMenu_Click"
  25.                             Cursor="Hand"
  26.                             FontWeight="Normal"
  27.                             Header="{Binding ConnectName}">
  28.                             <MenuItem.Icon>
  29.                                 <svgc:SvgViewbox
  30.                                     Width="16"
  31.                                     Height="16"
  32.                                     HorizontalAlignment="Left"
  33.                                     IsHitTestVisible="False"
  34.                                     Source="{Binding Icon}" />
  35.                             </MenuItem.Icon>
  36.                         </MenuItem>
  37.                     </HierarchicalDataTemplate>
  38.                 </MenuItem.ItemTemplate>
  39.             </MenuItem>
  40.             <MenuItem
  41.                 Name="MenuConnect"
  42.                 Cursor="Hand"
  43.                 FontWeight="Bold"
  44.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  45.                 Header="文件">
  46.                 <MenuItem.Icon>
  47.                     <Path
  48.                         Data="{StaticResource FileGeometry}"
  49.                         Fill="{DynamicResource DarkPrimaryBrush}"
  50.                         Stretch="Uniform" />
  51.                 </MenuItem.Icon>
  52.                 <MenuItem
  53.                     Name="AddConnect"
  54.                     Click="AddConnect_OnClick"
  55.                     FontWeight="Normal"
  56.                     Header="新建连接">
  57.                     <MenuItem.Icon>
  58.                         <Path
  59.                             Data="{StaticResource NewConnectGeometry}"
  60.                             Fill="{DynamicResource DarkPrimaryBrush}"
  61.                             Stretch="Uniform" />
  62.                     </MenuItem.Icon>
  63.                 </MenuItem>
  64.                 <MenuItem
  65.                     Name="ImportMark"
  66.                     Click="ImportMark_OnClick"
  67.                     FontWeight="Normal"
  68.                     Header="导入备注">
  69.                     <MenuItem.Icon>
  70.                         <Path
  71.                             Data="{StaticResource ImportGeometry}"
  72.                             Fill="{DynamicResource DarkPrimaryBrush}"
  73.                             Stretch="Uniform" />
  74.                     </MenuItem.Icon>
  75.                 </MenuItem>
  76.                 <MenuItem
  77.                     Name="ExportDoc"
  78.                     Click="ExportDoc_OnClick"
  79.                     FontWeight="Normal"
  80.                     Header="导出文档">
  81.                     <MenuItem.Icon>
  82.                         <Path
  83.                             Data="{StaticResource ExportGeometry}"
  84.                             Fill="{DynamicResource DarkPrimaryBrush}"
  85.                             Stretch="Uniform" />
  86.                     </MenuItem.Icon>
  87.                 </MenuItem>
  88.             </MenuItem>
  89.             <MenuItem
  90.                 Name="MenuGroup"
  91.                 Click="MenuGroup_OnClick"
  92.                 Cursor="Hand"
  93.                 FontWeight="Bold"
  94.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  95.                 Header="分组">
  96.                 <MenuItem.Icon>
  97.                     <Path
  98.                         Data="{StaticResource GroupGeometry}"
  99.                         Fill="{DynamicResource DarkPrimaryBrush}"
  100.                         Stretch="Uniform" />
  101.                 </MenuItem.Icon>
  102.             </MenuItem>
  103.             <MenuItem
  104.                 Name="MenuSetting"
  105.                 Click="MenuSetting_OnClick"
  106.                 Cursor="Hand"
  107.                 FontWeight="Bold"
  108.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  109.                 Header="设置">
  110.                 <MenuItem.Icon>
  111.                     <Path
  112.                         Data="{StaticResource SettingGeometry}"
  113.                         Fill="{DynamicResource DarkPrimaryBrush}"
  114.                         Stretch="Uniform" />
  115.                 </MenuItem.Icon>
  116.             </MenuItem>
  117.             <MenuItem
  118.                 Name="MenuAbout"
  119.                 Click="MenuAbout_OnClick"
  120.                 Cursor="Hand"
  121.                 FontWeight="Bold"
  122.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  123.                 Header="关于">
  124.                 <MenuItem.Icon>
  125.                     <Path
  126.                         Data="{StaticResource InfoGeometry}"
  127.                         Fill="{DynamicResource DarkPrimaryBrush}"
  128.                         Stretch="Uniform" />
  129.                 </MenuItem.Icon>
  130.             </MenuItem>
  131.         </Menu>
  132.     </StackPanel>
  133. </hc:GlowWindow.NonClientAreaContent>
复制代码
其中有个小插曲,在WPF中是默认不支持svg图形的,所以我们需要引用一个组件:SharpVectors,它的使用方法是这样的,引用svg界面需要引入下面语句:
xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
然后引用要显示的svg图形:
  1. [/code][size=3]二.左侧菜单栏[/size]
  2. 然后就是左侧的菜单栏,我们要实现一个数据库的选择和数据库对象的搜索,可以搜索相关表、视图、存储过程等对象。
  3. 首先我们要对我们的主界面进行一个简单的1:1:1的竖向布局,分别为左侧菜单栏、中间可以移动的分隔栏、右面的主界面:
  4. [code]   
  5.     <Grid x:Name="GridMain" Background="{StaticResource CloudDrawingBrush}">
  6.         <Grid.RowDefinitions>
  7.             <RowDefinition Height="*" />
  8.         </Grid.RowDefinitions>
  9.         <Grid.ColumnDefinitions>
  10.             <ColumnDefinition Width="3.3*" MinWidth="200" />
  11.             <ColumnDefinition Width="Auto" />
  12.             <ColumnDefinition Width="6.6*" />
  13.         </Grid.ColumnDefinitions>
  14. </Grid>
复制代码
现在我们要实现一个左侧树形的菜单栏,我们使用的是WPF里面的TreeView控件进行实现这样一个功能,下面是相关代码:
  1. <hc:GlowWindow.NonClientAreaContent>
  2.     <StackPanel Height="29" Margin="25,0,0,0">
  3.         <Menu HorizontalAlignment="Left">
  4.             <MenuItem
  5.                 x:Name="SwitchMenu"
  6.                 Cursor="Hand"
  7.                 FontWeight="Bold"
  8.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  9.                 Header="选择连接">
  10.                 <MenuItem.Icon>
  11.                     <Path
  12.                         Data="{StaticResource DownGeometry}"
  13.                         Fill="{DynamicResource DarkPrimaryBrush}"
  14.                         Stretch="Uniform" />
  15.                 </MenuItem.Icon>
  16.                 <MenuItem.ItemTemplate>
  17.                     <HierarchicalDataTemplate>
  18.                         <MenuItem
  19.                             Width="160"
  20.                             Margin="0"
  21.                             Padding="0"
  22.                             HorizontalAlignment="Left"
  23.                             VerticalAlignment="Stretch"
  24.                             Click="SwitchMenu_Click"
  25.                             Cursor="Hand"
  26.                             FontWeight="Normal"
  27.                             Header="{Binding ConnectName}">
  28.                             <MenuItem.Icon>
  29.                                 <svgc:SvgViewbox
  30.                                     Width="16"
  31.                                     Height="16"
  32.                                     HorizontalAlignment="Left"
  33.                                     IsHitTestVisible="False"
  34.                                     Source="{Binding Icon}" />
  35.                             </MenuItem.Icon>
  36.                         </MenuItem>
  37.                     </HierarchicalDataTemplate>
  38.                 </MenuItem.ItemTemplate>
  39.             </MenuItem>
  40.             <MenuItem
  41.                 Name="MenuConnect"
  42.                 Cursor="Hand"
  43.                 FontWeight="Bold"
  44.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  45.                 Header="文件">
  46.                 <MenuItem.Icon>
  47.                     <Path
  48.                         Data="{StaticResource FileGeometry}"
  49.                         Fill="{DynamicResource DarkPrimaryBrush}"
  50.                         Stretch="Uniform" />
  51.                 </MenuItem.Icon>
  52.                 <MenuItem
  53.                     Name="AddConnect"
  54.                     Click="AddConnect_OnClick"
  55.                     FontWeight="Normal"
  56.                     Header="新建连接">
  57.                     <MenuItem.Icon>
  58.                         <Path
  59.                             Data="{StaticResource NewConnectGeometry}"
  60.                             Fill="{DynamicResource DarkPrimaryBrush}"
  61.                             Stretch="Uniform" />
  62.                     </MenuItem.Icon>
  63.                 </MenuItem>
  64.                 <MenuItem
  65.                     Name="ImportMark"
  66.                     Click="ImportMark_OnClick"
  67.                     FontWeight="Normal"
  68.                     Header="导入备注">
  69.                     <MenuItem.Icon>
  70.                         <Path
  71.                             Data="{StaticResource ImportGeometry}"
  72.                             Fill="{DynamicResource DarkPrimaryBrush}"
  73.                             Stretch="Uniform" />
  74.                     </MenuItem.Icon>
  75.                 </MenuItem>
  76.                 <MenuItem
  77.                     Name="ExportDoc"
  78.                     Click="ExportDoc_OnClick"
  79.                     FontWeight="Normal"
  80.                     Header="导出文档">
  81.                     <MenuItem.Icon>
  82.                         <Path
  83.                             Data="{StaticResource ExportGeometry}"
  84.                             Fill="{DynamicResource DarkPrimaryBrush}"
  85.                             Stretch="Uniform" />
  86.                     </MenuItem.Icon>
  87.                 </MenuItem>
  88.             </MenuItem>
  89.             <MenuItem
  90.                 Name="MenuGroup"
  91.                 Click="MenuGroup_OnClick"
  92.                 Cursor="Hand"
  93.                 FontWeight="Bold"
  94.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  95.                 Header="分组">
  96.                 <MenuItem.Icon>
  97.                     <Path
  98.                         Data="{StaticResource GroupGeometry}"
  99.                         Fill="{DynamicResource DarkPrimaryBrush}"
  100.                         Stretch="Uniform" />
  101.                 </MenuItem.Icon>
  102.             </MenuItem>
  103.             <MenuItem
  104.                 Name="MenuSetting"
  105.                 Click="MenuSetting_OnClick"
  106.                 Cursor="Hand"
  107.                 FontWeight="Bold"
  108.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  109.                 Header="设置">
  110.                 <MenuItem.Icon>
  111.                     <Path
  112.                         Data="{StaticResource SettingGeometry}"
  113.                         Fill="{DynamicResource DarkPrimaryBrush}"
  114.                         Stretch="Uniform" />
  115.                 </MenuItem.Icon>
  116.             </MenuItem>
  117.             <MenuItem
  118.                 Name="MenuAbout"
  119.                 Click="MenuAbout_OnClick"
  120.                 Cursor="Hand"
  121.                 FontWeight="Bold"
  122.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  123.                 Header="关于">
  124.                 <MenuItem.Icon>
  125.                     <Path
  126.                         Data="{StaticResource InfoGeometry}"
  127.                         Fill="{DynamicResource DarkPrimaryBrush}"
  128.                         Stretch="Uniform" />
  129.                 </MenuItem.Icon>
  130.             </MenuItem>
  131.         </Menu>
  132.     </StackPanel>
  133. </hc:GlowWindow.NonClientAreaContent><hc:GlowWindow.NonClientAreaContent>
  134.     <StackPanel Height="29" Margin="25,0,0,0">
  135.         <Menu HorizontalAlignment="Left">
  136.             <MenuItem
  137.                 x:Name="SwitchMenu"
  138.                 Cursor="Hand"
  139.                 FontWeight="Bold"
  140.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  141.                 Header="选择连接">
  142.                 <MenuItem.Icon>
  143.                     <Path
  144.                         Data="{StaticResource DownGeometry}"
  145.                         Fill="{DynamicResource DarkPrimaryBrush}"
  146.                         Stretch="Uniform" />
  147.                 </MenuItem.Icon>
  148.                 <MenuItem.ItemTemplate>
  149.                     <HierarchicalDataTemplate>
  150.                         <MenuItem
  151.                             Width="160"
  152.                             Margin="0"
  153.                             Padding="0"
  154.                             HorizontalAlignment="Left"
  155.                             VerticalAlignment="Stretch"
  156.                             Click="SwitchMenu_Click"
  157.                             Cursor="Hand"
  158.                             FontWeight="Normal"
  159.                             Header="{Binding ConnectName}">
  160.                             <MenuItem.Icon>
  161.                                 <svgc:SvgViewbox
  162.                                     Width="16"
  163.                                     Height="16"
  164.                                     HorizontalAlignment="Left"
  165.                                     IsHitTestVisible="False"
  166.                                     Source="{Binding Icon}" />
  167.                             </MenuItem.Icon>
  168.                         </MenuItem>
  169.                     </HierarchicalDataTemplate>
  170.                 </MenuItem.ItemTemplate>
  171.             </MenuItem>
  172.             <MenuItem
  173.                 Name="MenuConnect"
  174.                 Cursor="Hand"
  175.                 FontWeight="Bold"
  176.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  177.                 Header="文件">
  178.                 <MenuItem.Icon>
  179.                     <Path
  180.                         Data="{StaticResource FileGeometry}"
  181.                         Fill="{DynamicResource DarkPrimaryBrush}"
  182.                         Stretch="Uniform" />
  183.                 </MenuItem.Icon>
  184.                 <MenuItem
  185.                     Name="AddConnect"
  186.                     Click="AddConnect_OnClick"
  187.                     FontWeight="Normal"
  188.                     Header="新建连接">
  189.                     <MenuItem.Icon>
  190.                         <Path
  191.                             Data="{StaticResource NewConnectGeometry}"
  192.                             Fill="{DynamicResource DarkPrimaryBrush}"
  193.                             Stretch="Uniform" />
  194.                     </MenuItem.Icon>
  195.                 </MenuItem>
  196.                 <MenuItem
  197.                     Name="ImportMark"
  198.                     Click="ImportMark_OnClick"
  199.                     FontWeight="Normal"
  200.                     Header="导入备注">
  201.                     <MenuItem.Icon>
  202.                         <Path
  203.                             Data="{StaticResource ImportGeometry}"
  204.                             Fill="{DynamicResource DarkPrimaryBrush}"
  205.                             Stretch="Uniform" />
  206.                     </MenuItem.Icon>
  207.                 </MenuItem>
  208.                 <MenuItem
  209.                     Name="ExportDoc"
  210.                     Click="ExportDoc_OnClick"
  211.                     FontWeight="Normal"
  212.                     Header="导出文档">
  213.                     <MenuItem.Icon>
  214.                         <Path
  215.                             Data="{StaticResource ExportGeometry}"
  216.                             Fill="{DynamicResource DarkPrimaryBrush}"
  217.                             Stretch="Uniform" />
  218.                     </MenuItem.Icon>
  219.                 </MenuItem>
  220.             </MenuItem>
  221.             <MenuItem
  222.                 Name="MenuGroup"
  223.                 Click="MenuGroup_OnClick"
  224.                 Cursor="Hand"
  225.                 FontWeight="Bold"
  226.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  227.                 Header="分组">
  228.                 <MenuItem.Icon>
  229.                     <Path
  230.                         Data="{StaticResource GroupGeometry}"
  231.                         Fill="{DynamicResource DarkPrimaryBrush}"
  232.                         Stretch="Uniform" />
  233.                 </MenuItem.Icon>
  234.             </MenuItem>
  235.             <MenuItem
  236.                 Name="MenuSetting"
  237.                 Click="MenuSetting_OnClick"
  238.                 Cursor="Hand"
  239.                 FontWeight="Bold"
  240.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  241.                 Header="设置">
  242.                 <MenuItem.Icon>
  243.                     <Path
  244.                         Data="{StaticResource SettingGeometry}"
  245.                         Fill="{DynamicResource DarkPrimaryBrush}"
  246.                         Stretch="Uniform" />
  247.                 </MenuItem.Icon>
  248.             </MenuItem>
  249.             <MenuItem
  250.                 Name="MenuAbout"
  251.                 Click="MenuAbout_OnClick"
  252.                 Cursor="Hand"
  253.                 FontWeight="Bold"
  254.                 Foreground="{DynamicResource DarkPrimaryBrush}"
  255.                 Header="关于">
  256.                 <MenuItem.Icon>
  257.                     <Path
  258.                         Data="{StaticResource InfoGeometry}"
  259.                         Fill="{DynamicResource DarkPrimaryBrush}"
  260.                         Stretch="Uniform" />
  261.                 </MenuItem.Icon>
  262.             </MenuItem>
  263.         </Menu>
  264.     </StackPanel>
  265. </hc:GlowWindow.NonClientAreaContent>   
  266.     <Grid x:Name="GridMain" Background="{StaticResource CloudDrawingBrush}">
  267.         <Grid.RowDefinitions>
  268.             <RowDefinition Height="*" />
  269.         </Grid.RowDefinitions>
  270.         <Grid.ColumnDefinitions>
  271.             <ColumnDefinition Width="3.3*" MinWidth="200" />
  272.             <ColumnDefinition Width="Auto" />
  273.             <ColumnDefinition Width="6.6*" />
  274.         </Grid.ColumnDefinitions>
  275. </Grid>   
  276.     <Grid x:Name="GridMain" Background="{StaticResource CloudDrawingBrush}">
  277.         <Grid.RowDefinitions>
  278.             <RowDefinition Height="*" />
  279.         </Grid.RowDefinitions>
  280.         <Grid.ColumnDefinitions>
  281.             <ColumnDefinition Width="3.3*" MinWidth="200" />
  282.             <ColumnDefinition Width="Auto" />
  283.             <ColumnDefinition Width="6.6*" />
  284.         </Grid.ColumnDefinitions>
  285. </Grid>   
  286.     <Grid x:Name="GridMain" Background="{StaticResource CloudDrawingBrush}">
  287.         <Grid.RowDefinitions>
  288.             <RowDefinition Height="*" />
  289.         </Grid.RowDefinitions>
  290.         <Grid.ColumnDefinitions>
  291.             <ColumnDefinition Width="3.3*" MinWidth="200" />
  292.             <ColumnDefinition Width="Auto" />
  293.             <ColumnDefinition Width="6.6*" />
  294.         </Grid.ColumnDefinitions>
  295. </Grid>   
  296.     <Grid x:Name="GridMain" Background="{StaticResource CloudDrawingBrush}">
  297.         <Grid.RowDefinitions>
  298.             <RowDefinition Height="*" />
  299.         </Grid.RowDefinitions>
  300.         <Grid.ColumnDefinitions>
  301.             <ColumnDefinition Width="3.3*" MinWidth="200" />
  302.             <ColumnDefinition Width="Auto" />
  303.             <ColumnDefinition Width="6.6*" />
  304.         </Grid.ColumnDefinitions>
  305. </Grid>                                       
复制代码
在这里我没有详细介绍底层c#的相关代码,里面逻辑有些复杂感兴趣的可以去我的开源项目中学习。在上面的左侧菜单代码中,我们使用的不仅有TreeView控件、也有ContextMenu、hc:LoadingLine等控件,还有自己写的自定义控件。
其实WPF要比WinForm好用不少,不仅支持MVVM数据绑定还支持灵活的页面渲染,自从用了WPF再也不用WinForm了。
今天分享暂时到这里,下一篇讲介绍DataGrid表格数据绑定及相关条件搜索。下面是工具的开源地址,感兴趣的可以Clone下来学习一下。码砖不易,喜欢的麻烦点下Star.
开源地址

https://gitee.com/izhaofu/SmartSQL



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4