博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Map 3D开发实战系列] Map Resource Explorer 之五--界面设计
阅读量:6810 次
发布时间:2019-06-26

本文共 4791 字,大约阅读时间需要 15 分钟。

目录

 

好了,前面说了那么多,终归是准备工作,现在开始做实际工作,来切实创建一个基于WPF的界面。我们需要创建一个AutoCAD风格的Palett,放置一个TreeView控件用来显示我们的所有资源。然后需要一个ToolBar,加一个刷新按钮。

在Map 3D中支持的资源类型为FeatureSource,LayerDefiniation和SymbolDefinition。同一个文档中可能会有多个FeatureSource,多个图层LayerDefiniation和SymbolDefinition,所有我们可以考虑按照资源类型类组织资源在TreeView中的显示。自然还需要一个Toolbar来放置常用操作按钮,比如刷新显示。

 

下面来实现上面的界面设计,我们需要添加一个palette并加入一个WPF的用户控件。为了更好的组织项目,我把界面相关的类放置在UI目录里。首先创建一个WPF User Control,拖一个WPF TreeView控件和Toolbar和Context Menu进去。还需要添加一些图片来作为Toolbar按钮上用的图片,并把这些图片编译为资源:

 

下面是XAML代码:

为了把WPF用户控件加入到Palette中,可以用前面文章中说的AddVisual方法。这里我用了Add方法,不过这个Add方法只接受System.Windows.Forms.Control类型的控件,所以需要弄一个windows用户控件做为外套。新建一个Windows 用户控件,界面上不用放什么控件,其中用到了System.Windows.Forms.Integration.ElementHost类,需要添加引用PresentationFramework.dll.后台代码如下:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using System.Windows.Forms.Integration; namespace MapResourceExplorer.UI {
public partial class Panel : UserControl {
private ExplorerForm _form; public Panel() {
InitializeComponent(); // Create the ElementHost control for hosting the // WPF UserControl. ElementHost host = new ElementHost(); host.Dock = DockStyle.Fill; // Create the WPF UserControl. _form = new ExplorerForm(); // Assign the WPF UserControl to the ElementHost control's // Child property. host.Child = _form; // Add the ElementHost control to the form's // collection of child controls. this.Controls.Add(host); } internal ExplorerForm Child {
get {
return _form; } } } }

 

 

然后来创建autoCAD风格的Palette,这里创建了一个ResourceExplorerPalette类,并用Singleton模式来保证只有一个实例。对应Palette的风格样式可以由枚举类型PaletteSetStyles指定:

 

//Set the properties of paletteSet            _paletteSet.Style = PaletteSetStyles.NameEditable |                PaletteSetStyles.ShowPropertiesMenu |                PaletteSetStyles.ShowAutoHideButton |                PaletteSetStyles.UsePaletteNameAsTitleForSingle |                PaletteSetStyles.Snappable |                PaletteSetStyles.ShowCloseButton;
 
在这个类中定义了Show方法,来显示这个自定义的palette。完整的代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Autodesk.AutoCAD.Windows; namespace MapResourceExplorer.UI {
internal class ResourceExplorerPalette {
private static string PaletteName = @"Resource Explorer"; private PaletteSet _paletteSet; private Panel _panel; /// /// Using Singleton pattern to make sure there'll be only one instance of this class. /// private static ResourceExplorerPalette _instance; public static ResourceExplorerPalette Instance {
get {
if (_instance == null) {
_instance = new ResourceExplorerPalette(); } return _instance; } } private ResourceExplorerPalette() {
_paletteSet = new PaletteSet(PaletteName); //Set the properties of paletteSet _paletteSet.Style = PaletteSetStyles.NameEditable | PaletteSetStyles.ShowPropertiesMenu | PaletteSetStyles.ShowAutoHideButton | PaletteSetStyles.UsePaletteNameAsTitleForSingle | PaletteSetStyles.Snappable | PaletteSetStyles.ShowCloseButton; _panel = new Panel(); _paletteSet.Add(PaletteName, _panel); } public PaletteSet PaletteSet {
get {
return _paletteSet; } } public ExplorerForm ExplorerForm {
get {
return _panel.Child; } } /// /// Show or hide the UI. /// public void Show() {
_paletteSet.Visible = true; _paletteSet.KeepFocus = true; ExplorerForm.ForceRefresh(); } } }
好了,基本的架子搭起来了,可以来定义一个命令来显示这个palette界面了,在前文中提到的Commands类里添加一个方法来定义一个自定义的AutoCAD命令,这样通过netload命令加载这个程序集后,就可以通过输入自定义命令来显示这个自定义的palette了:
[CommandMethod("ShowResourceExplorer")] public void ResourceExplorerCommand() {
ResourceExplorerPalette.Instance.Show(); }
 
今天先写到这儿,下来再做具体的关于资源操作的实现。
完整代码在google code,你可以在线浏览或者通过SVN下载自己测试一下。
 
Cheers,
峻祁连
 
作者:
邮箱:junqilian@163.com 
出处:  
转载请保留此信息。
本文转自峻祁连. Moving to Cloud/Mobile博客园博客,原文链接:http://www.cnblogs.com/junqilian/archive/2011/02/07/1949621.html
,如需转载请自行联系原作者
你可能感兴趣的文章
笔试/面试题
查看>>
angular1的复选框指令--checklistModel
查看>>
Java内存区域
查看>>
nginx+uwsgi启动Django项目
查看>>
深入理解Python中赋值、深拷贝(deepcopy)、浅拷贝(copy)
查看>>
最大岛屿-----简单的 搜索
查看>>
判断当前线程是否有管理者权限
查看>>
js 的arguments的一些理解资料
查看>>
xampp启动遇到的小问题
查看>>
python set dict tuple and list
查看>>
通过 docker 搭建自用的 gitlab 服务
查看>>
svg-写一个简单的进度条
查看>>
app 开发
查看>>
.net framework
查看>>
[NOI2016]优秀的拆分
查看>>
贝叶斯分类
查看>>
mongodb笔记 getting started
查看>>
Aaron Swartz Rewriting Reddit中关于web.py的创建思路
查看>>
linux信任公钥的配置
查看>>
09、多线程(一) -- 基本概念
查看>>