基于WPF重復造輪子,寫一款數據庫文檔管理工具(一)

a83129e836ead56b5fecddb9fe3a3dd8.png

項目背景

公司業務歷史悠久且復雜,數據庫的表更是多而繁雜,每次基于老業務做功能開發都需要去翻以前的表和業務代碼。需要理解舊的表的用途以及包含的字段的含義,表少還好說,但是表一多這就很浪費時間,而且留下來的文檔都是殘缺不全,每次查一些表的含義都要捯飭很久。在網上搜索關于數據庫文檔管理工具搜到最多的就是Screw和DBCHM,一個是基于Java的工具、另一個則是bug很多,表一多就一直轉圈圈進不去。所以自己就動手開發了這款SmartSQL的工具。

它是一款基于.Net 4.6.1、WPF開發的一款數據庫文檔管理,不僅支持多種數據庫(SQLServer、MySQL、PostgreSQL、SQLite)表、視圖、存儲過程的查詢管理,還支持對其進行導出成離線文檔,支持的文檔包括CHM、Word、Excel、PDF、HTML、Xml、Json、MarkDown等多種格式。

現在將它開源分享出來,供更多的小伙伴使用和參考學習(文末附開源地址)。

64813beb0bf69b457c807c2f4b7d6ecb.png

技術棧

  • .Net 4.6.1

  • WPF

  • HandyControl

  • SqlSugar

  • AvalonEdit

  • SharpVectors

HandyControl是一款非常優秀的WPF框架,做出來的頁面都很漂亮,所以我們選擇使用它。

Nuget中引用HandyControl:

592b41094da4ff7f81f95c31f450b53a.png

一.菜單欄

f9c710a9fc1072418350a88d83ad64a8.png

然后我們要實現一個基于WPF邊框上的菜單欄,剛好HandyControl中有這么一個菜單欄的控件,
下面就是實現菜單欄的方法:

<hc:GlowWindow.NonClientAreaContent><StackPanel Height="29" Margin="25,0,0,0"><Menu HorizontalAlignment="Left"><MenuItemx:Name="SwitchMenu"Cursor="Hand"FontWeight="Bold"Foreground="{DynamicResource DarkPrimaryBrush}"Header="選擇連接"><MenuItem.Icon><PathData="{StaticResource DownGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon><MenuItem.ItemTemplate><HierarchicalDataTemplate><MenuItemWidth="160"Margin="0"Padding="0"HorizontalAlignment="Left"VerticalAlignment="Stretch"Click="SwitchMenu_Click"Cursor="Hand"FontWeight="Normal"Header="{Binding ConnectName}"><MenuItem.Icon><svgc:SvgViewboxWidth="16"Height="16"HorizontalAlignment="Left"IsHitTestVisible="False"Source="{Binding Icon}" /></MenuItem.Icon></MenuItem></HierarchicalDataTemplate></MenuItem.ItemTemplate></MenuItem><MenuItemName="MenuConnect"Cursor="Hand"FontWeight="Bold"Foreground="{DynamicResource DarkPrimaryBrush}"Header="文件"><MenuItem.Icon><PathData="{StaticResource FileGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon><MenuItemName="AddConnect"Click="AddConnect_OnClick"FontWeight="Normal"Header="新建連接"><MenuItem.Icon><PathData="{StaticResource NewConnectGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon></MenuItem><MenuItemName="ImportMark"Click="ImportMark_OnClick"FontWeight="Normal"Header="導入備注"><MenuItem.Icon><PathData="{StaticResource ImportGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon></MenuItem><MenuItemName="ExportDoc"Click="ExportDoc_OnClick"FontWeight="Normal"Header="導出文檔"><MenuItem.Icon><PathData="{StaticResource ExportGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon></MenuItem></MenuItem><MenuItemName="MenuGroup"Click="MenuGroup_OnClick"Cursor="Hand"FontWeight="Bold"Foreground="{DynamicResource DarkPrimaryBrush}"Header="分組"><MenuItem.Icon><PathData="{StaticResource GroupGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon></MenuItem><MenuItemName="MenuSetting"Click="MenuSetting_OnClick"Cursor="Hand"FontWeight="Bold"Foreground="{DynamicResource DarkPrimaryBrush}"Header="設置"><MenuItem.Icon><PathData="{StaticResource SettingGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon></MenuItem><MenuItemName="MenuAbout"Click="MenuAbout_OnClick"Cursor="Hand"FontWeight="Bold"Foreground="{DynamicResource DarkPrimaryBrush}"Header="關于"><MenuItem.Icon><PathData="{StaticResource InfoGeometry}"Fill="{DynamicResource DarkPrimaryBrush}"Stretch="Uniform" /></MenuItem.Icon></MenuItem></Menu></StackPanel>
</hc:GlowWindow.NonClientAreaContent>
<!--  工具欄菜單  -->

其中有個小插曲,在WPF中是默認不支持svg圖形的,所以我們需要引用一個組件:SharpVectors,它的使用方法是這樣的,引用svg界面需要引入下面語句:
xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"
然后引用要顯示的svg圖形:

<svgc:SvgViewboxWidth="16"Height="16"HorizontalAlignment="Left"IsHitTestVisible="False"Source="{Binding?Icon}"?/>

二.左側菜單欄

然后就是左側的菜單欄,我們要實現一個數據庫的選擇和數據庫對象的搜索,可以搜索相關表、視圖、存儲過程等對象。
首先我們要對我們的主界面進行一個簡單的1:1:1的豎向布局,分別為左側菜單欄、中間可以移動的分隔欄、右面的主界面:

<!--  Main區域  -->
<Grid x:Name="GridMain" Background="{StaticResource CloudDrawingBrush}"><Grid.RowDefinitions><RowDefinition Height="*" /></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="3.3*" MinWidth="200" /><ColumnDefinition Width="Auto" /><ColumnDefinition Width="6.6*" /></Grid.ColumnDefinitions>
</Grid>

現在我們要實現一個左側樹形的菜單欄,我們使用的是WPF里面的TreeView控件進行實現這樣一個功能,下面是相關代碼:

<DockPanel Grid.Row="0" Grid.Column="0"><hc:SimplePanel><BorderMargin="5,5,0,5"Background="{DynamicResource RegionBrush}"CornerRadius="{Binding CornerRadius}"><GridHeight="Auto"Margin="5"Background="Transparent"><TextBox x:Name="HidSelectDatabase" Visibility="Hidden" /><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="8*" /><ColumnDefinition Width="1*" MinWidth="30" /></Grid.ColumnDefinitions><ComboBoxx:Name="SelectDatabase"Height="30"VerticalAlignment="Top"HorizontalContentAlignment="Stretch"hc:BorderElement.CornerRadius="5"hc:InfoElement.Placeholder="請選擇數據庫"Cursor="Hand"IsTextSearchEnabled="True"SelectionChanged="SelectDatabase_OnSelectionChanged"Style="{StaticResource ComboBoxExtend}"Text="{Binding DbName}"><ComboBox.ItemTemplate><DataTemplate><StackPanel VerticalAlignment="Center" Orientation="Horizontal"><ImageWidth="11"Height="15"Source="/SmartSQL;component/Resources/Img/dataBase.ico" /><TextBlockMargin="5,0,0,0"HorizontalAlignment="Center"VerticalAlignment="Center"Text="{Binding DbName}" /></StackPanel></DataTemplate></ComboBox.ItemTemplate></ComboBox><ButtonName="BtnFresh"Grid.Column="2"Margin="0,0,0,0"Padding="4"VerticalAlignment="Top"Background="Transparent"BorderThickness="0"Click="BtnFresh_OnClick"Cursor="Hand"><Button.Content><Image Source="/SmartSQL;component/Resources/Img/Refresh.png" Stretch="Fill" /></Button.Content></Button></Grid><hc:SearchBarx:Name="SearchMenu"Height="30"Margin="0,34,0,0"Padding="5,0,5,0"VerticalAlignment="Top"HorizontalContentAlignment="Stretch"hc:BorderElement.CornerRadius="5"hc:InfoElement.Placeholder="搜索數據表/視圖/存儲過程"FontSize="13"ShowClearButton="True"Style="{StaticResource SearchBarPlus}"TextChanged="SearchMenu_OnTextChanged" /><TabControlx:Name="TabLeftType"Margin="0,65,0,40"SelectionChanged="TabLeftType_OnSelectionChanged"Style="{StaticResource TabControlInLine}"><TabItemx:Name="TabAllData"Cursor="Hand"Header="全部"IsSelected="True" /><TabItemx:Name="TabGroupData"Cursor="Hand"Header="分組"IsSelected="False" /><!--<TabItemx:Name="TabFavData"Cursor="Hand"Header="收藏"IsSelected="False" />--></TabControl><TreeViewx:Name="TreeViewTables"Margin="0,100,0,0"VerticalAlignment="Top"BorderThickness="0"ItemsSource="{Binding TreeViewData}"SelectedItemChanged="SelectedTable_OnClick"><TreeView.ItemContainerStyle><Style BasedOn="{StaticResource TreeViewItemBaseStyle}" TargetType="{x:Type TreeViewItem}"><Setter Property="IsExpanded" Value="{Binding IsExpanded}" /><Setter Property="FontWeight" Value="{Binding FontWeight}" /><Setter Property="FontSize" Value="12" /><Setter Property="Visibility" Value="{Binding Visibility}" /><Setter Property="Foreground" Value="{Binding TextColor}" /><Setter Property="Cursor" Value="Hand" /><!--  禁止水平滾動條自動滾動  --><EventSetter Event="RequestBringIntoView" Handler="EventSetter_OnHandler" /><Style.Triggers><Trigger Property="IsSelected" Value="True"><Setter Property="FontWeight" Value="Bold" /></Trigger></Style.Triggers>
</Style></TreeView.ItemContainerStyle><TreeView.ContextMenu><!--  右鍵菜單  --><ContextMenu Visibility="Visible"><MenuItemx:Name="MenuSelectedItem"Padding="5,0,5,0"VerticalAlignment="Center"Click="MenuSelectedItem_OnClick"Cursor="Hand"Header="復制對象名" /></ContextMenu></TreeView.ContextMenu><TreeView.ItemTemplate><HierarchicalDataTemplate DataType="{x:Type models:TreeNodeItem}" ItemsSource="{Binding Children}"><StackPanel Orientation="Horizontal"><svgc:SvgViewboxWidth="12"Height="12"Margin="0,0,5,0"HorizontalAlignment="Left"Source="{Binding Icon}" /><TextBlockVerticalAlignment="Center"FontSize="12"Text="{Binding DisplayName}"ToolTip="{Binding DisplayName}" /></StackPanel></HierarchicalDataTemplate></TreeView.ItemTemplate></TreeView><Gridx:Name="NoDataText"Margin="0,100,0,5"HorizontalAlignment="Stretch"Background="White"Cursor="Arrow"><local:NoDataAreax:Name="NoDataAreaText"Margin="0"HorizontalAlignment="Center"ShowType="All" /></Grid><GridMargin="0"VerticalAlignment="Bottom"Visibility="Hidden"><Grid.ColumnDefinitions><ColumnDefinition Width="4*" /><ColumnDefinition Width="6*" /><ColumnDefinition Width="Auto" /></Grid.ColumnDefinitions><Grid><ComboBoxx:Name="CbTargetConnect"Height="26"VerticalAlignment="Bottom"HorizontalContentAlignment="Left"hc:InfoElement.Placeholder="目標連接"Cursor="Hand"DisplayMemberPath="ConnectName"IsTextSearchEnabled="True"SelectedValuePath="DbMasterConnectString"SelectionChanged="CbTargetConnect_OnSelectionChanged"Style="{StaticResource ComboBoxExtend}" /></Grid><Grid Grid.Column="1" Margin="5,0,0,0"><ComboBoxx:Name="CbTargetDatabase"MinWidth="50"VerticalAlignment="Bottom"HorizontalContentAlignment="Left"hc:InfoElement.Placeholder="目標數據庫"Cursor="Hand"IsTextSearchEnabled="True"Style="{StaticResource ComboBoxExtend}" /></Grid><Grid Grid.Column="2"><!--  差異比較按鈕  --><Buttonx:Name="BtnCompare"Height="30"Margin="5,5,0,0"HorizontalAlignment="Right"hc:BorderElement.CornerRadius="6"hc:IconElement.Geometry="{StaticResource CompareGeometry}"Click="BtnCompare_OnClick"Content="差異比較"Cursor="Hand" /></Grid></Grid><!--  數據加載Loading  --><hc:LoadingLinex:Name="LoadingLine"Margin="0,0,0,0"Visibility="Collapsed" /></Grid></Border></hc:SimplePanel></DockPanel>

在這里我沒有詳細介紹底層c#的相關代碼,里面邏輯有些復雜感興趣的可以去我的開源項目中學習。在上面的左側菜單代碼中,我們使用的不僅有TreeView控件、也有ContextMenuhc:LoadingLine等控件,還有自己寫的自定義控件。

其實WPF要比WinForm好用不少,不僅支持MVVM數據綁定還支持靈活的頁面渲染,自從用了WPF再也不用WinForm了。

今天分享暫時到這里,下一篇將介紹DataGrid表格數據綁定及相關條件搜索。下面是工具的開源地址,感興趣的可以Clone下來學習一下。碼磚不易,喜歡的麻煩點下Star.

開源地址

https://gitee.com/izhaofu/SmartSQL


cdeb539a0bbb232f99ffba5b45e41c74.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284119.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284119.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284119.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉]GitBook使用教程收藏

GitBook使用教程 最簡單的方式就是使用GitBook編輯器&#xff0c;沒有什么難度&#xff0c;后面的教程主要針對命令行的方式 PS&#xff1a;GitBook的book頁面默認沒有download按鈕的 需要到設置中打開&#xff0c;打開后再次publish生效 同步GitHub 更新失敗&#xff0c;無法…

二 面向對象三大特性

一 繼承與派生 一、繼承定義 二、繼承與抽象的關系 三、繼承與重用性 四、派生 五、組合與重用性 六、接口與歸一化設計 七、抽象類 八、繼承實現的原理 九、子類中調用父類的方法 二 多態與多態性 一、多態 二、多態性 三 封裝 一、封裝定義 二、特性(property) 三、封裝與擴展…

CSS3新屬性

邊框&#xff1a; border-radius 用于創建圓角 div { border:2px solid; border-radius:25px; -moz-border-radius:25px; /* Old Firefox */ } box-shadow 用于向方框添加陰影 div { box-shadow: 10px 10px 5px #888888; } border-image 使用圖片來創建邊框 div { border-image…

Android實用筆記——使用Spinner實現下拉列表

2019獨角獸企業重金招聘Python工程師標準>>> 1、編輯activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"mat…

基于.NET 6 的開源訪客管理系統

簡單介紹一下系統功能系統用于簡化訪客登記、查詢、保存。傳統的登記方式&#xff0c;不僅浪費紙張&#xff0c;而且還面臨保存的問題&#xff0c;查閱不方便。該系統為了在疫情期間能很好管理訪客登記做好風險管控,同時可以整合智能設備做到自動確認并跟蹤訪客的行動軌跡,該項…

完整的產品管理工作流程

產品經理的工作具體會落實到工作流程中&#xff0c;所以工作流程很大程度上會體現工作層次。很多白領產品經理&#xff0c;多年來在一個低層次的流程中轉圈——理需求、畫原型、寫文檔、管項目、驗收上線&#xff0c;一個版本上線之后立刻對下一個版本理需求、畫原型、寫文檔、…

java爬蟲-簡單爬取網頁圖片

剛剛接觸到“爬蟲”這個詞的時候是在大一&#xff0c;那時候什么都不明白&#xff0c;但知道了百度、谷歌他們的搜索引擎就是個爬蟲。 現在大二。再次燃起對爬蟲的熱愛&#xff0c;查閱資料&#xff0c;知道常用java、python語言編程&#xff0c;這次我選擇了java。在網上查找的…

擴展方法必須在非泛型靜態類中定義

擴展方法必須在非泛型靜態類中定義&#xff1a;public class CustomerHelperClass{public static MvcHtmlString CreateImage(string p_w_picpathSource, string altText, string width, string height){//通過TagBulider創建標簽TagBuilder p_w_picpathTag new TagBuilder(&…

Windows Server 2016-圖形化遷移FSMO角色

上章節我們簡單介紹了三種不同方式查看FSMO主機角色信息&#xff0c;在開篇之前我們簡單回顧一下FSMO五種操作主機角色&#xff1a;林范圍操作主機角色有兩種&#xff0c;分別是 架構主機角色&#xff08;Schema Master&#xff09;和 域命名主機角色&#xff08;Domain Naming…

C# WPF設備監控軟件(經典)-下篇

上節已經對本軟件的功能和意圖進行了詳細講解&#xff0c;這節就不再啰嗦&#xff0c;本節主要對功能實現和代碼部分展開講解.01—前臺代碼前臺XAML:<Window x:Class"EquipmentMonitor.EquipmentView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/pr…

[轉]互聯網最大謠言:程序員35歲必淘汰?今天我就來擊碎他

朋友&#xff0c;只要你是程序員&#xff0c;你一定知道996和“程序員35歲必死”的言論。 這兩個話題在互聯網上的討論一次比一次激烈。 996工作制&#xff0c;眾所周知&#xff0c;每天早上9點到崗&#xff0c;一直待到晚上9點&#xff0c;每周工作6天&#xff0c;很多互聯網公…

【ArcGIS微課1000例】0057:將多波段柵格(影像.tif)背景設置為無數據nodata的方法

本文講解將多波段柵格(影像.tif)背景設置為無數據nodata的方法。 文章目錄 一、背景值識別二、背景值去除【推薦閱讀】: 【ArcGIS微課1000例】0056:將單波段柵格背景設置為無數據NoData的方法 一、背景值識別 可以用【識別】工具來獲取影像數據的背景值。 在背景上單擊,…

華為HCIA認證H12-811題庫新增

801、[單選題]178/832、在系統視圖下鍵入什么命令可以切換到用戶視圖? A quit B souter C system-view D user-view 試題答案&#xff1a;A 試題解析&#xff1a;在系統視圖下鍵入quit命令退出到用戶視圖。因此答案選A。 802、[單選題]“網絡管理員在三層交換機上創建了V…

經典Java微服務架構教程 微服務從開發到部署

圖書目錄腦圖&#xff1a; 本書根據開源項目整理&#xff0c;由于原在線文檔無法正常使用&#xff0c;本人重新在Github上重新布署了一套在線文檔。 書中講解非常詳細&#xff0c;并且有在線的視頻教程&#xff0c;另有在線文檔和在線的源碼。 書中的代碼由于PDF排版問題可能顯…

linux下redis安裝

轉自&#xff1a;http://blog.java1234.com/blog/articles/311.html Redis從一開始就只支持Linux&#xff0c;后面雖然有團隊搞出Window版本&#xff0c;但是我還是建議大伙安裝到Linux中。 準備工作 &#xff08;wm VirtualBox&#xff09; VMware 以及Xshell https://redis…

cobbler koan自動重裝系統

介紹 koan是kickstart-over-a-network的縮寫&#xff0c;它是cobbler的客戶端幫助程序&#xff0c;koan允許你通過網絡提供虛擬機&#xff0c;也允許你重裝已經存在的客戶端。當運行時&#xff0c;koan會從遠端的cobbler server獲取安裝信息&#xff0c;然后根據獲取的安裝信息…

Quartz.NET simple_demo

Quartz.NET是一個開源的作業調度框架&#xff0c;非常適合在平時的工作中&#xff0c;定時輪詢數據庫同步&#xff0c;定時郵件通知&#xff0c;定時處理數據等。 Quartz.NET允許開發人員根據時間間隔&#xff08;或天&#xff09;來調度作業。它實現了作業和觸發器的多對多關系…

Hello Playwright:(9)執行 JavaScript 代碼

Playwright 提供了大量的 API 用于與頁面元素交互&#xff0c;但是在某些場景下還是不能完全滿足要求。比如我們需要獲得包括元素本身的 HTML&#xff0c;但是目前只有下列 API :InnerHTMLAsync 返回元素內的 HTML 內容InnerTextAsync 返回元素內的文本內容而使用 JavaScript 執…

【PhotoScan精品教程】photoscan無法啟動此程序,因為計算機中丟失cholmod.dll解決辦法

安裝完航測軟件photoscan&#xff0c;打開時提示&#xff1a;無法啟動此程序&#xff0c;因為計算機中丟失 cholmod.dll解決辦法。 錯誤提示&#xff1a; 解決辦法&#xff1a; 并不是缺少該動態鏈接庫文件&#xff0c;而是補丁文件拷貝錯了。

什么是中臺?企業為什么要建中臺?從數據中臺到AI中臺。

從去年開始&#xff0c;好像就有一只無形的手一直將我與“微服務”、“平臺化”、“中臺化”撮合在一起&#xff0c;給我帶來了很多的困擾和思考與收獲。 故事的開始源于去年的技術雷達峰會&#xff0c;我在會上做了一場關于平臺崛起的主題分享&#xff08;《The Rise of Plat…