[Map 3D开发实战系列] Map Resource Explorer 之五--界面设计

简介:


目录

[Map 3D开发实战系列] Map Resource Explorer 背景介绍--Kick off

[Map 3D开发实战系列] Map Resource Explorer 之二-- 运行和调试

[Map 3D开发实战系列] Map Resource Explorer 之三-- 添加AutoCAD风格的Palette界面

[Map 3D开发实战系列] Map Resource Explorer 之四-- Map3D开发中的WPF

 

好了,前面说了那么多,终归是准备工作,现在开始做实际工作,来切实创建一个基于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按钮上用的图片,并把这些图片编译为资源:

image

 

下面是XAML代码:

<UserControl x:Class="MapResourceExplorer.UI.ExplorerForm"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Grid>
        <TreeView Margin="12,44,12,20" Name="treeView1" PreviewMouseRightButtonDown="treeView1_PreviewMouseRightButtonDown">
            <TreeView.ItemContainerStyle>
                <Style TargetType="{x:Type TreeViewItem}">
                    <EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="TreeViewItem_PreviewMouseRightButtonDown"/>
                </Style>
            </TreeView.ItemContainerStyle>
            <TreeView.CommandBindings>


            </TreeView.CommandBindings>
            <TreeView.ContextMenu>
                <ContextMenu Name="ResOpMenu" ContextMenuOpening="ContextMenu_Opening">
                    <MenuItem Header="Show Resource Content" Click="ShowResourceContent_Clicked"/>
                    <MenuItem Header="..."/>
                </ContextMenu>
            </TreeView.ContextMenu>

            <TreeViewItem Header="FeatureSource" >
                <TreeViewItem Header="Library://1....." ToolTip="" ></TreeViewItem>
            </TreeViewItem>
            <TreeViewItem Header="Layer Definition">
                <TreeViewItem Header="Library://1....."></TreeViewItem>
            </TreeViewItem>

        </TreeView>

        <ToolBar Height="26" Margin="12,12,12,0" Name="toolBar1" VerticalAlignment="Top" >
            <Button Name="Refresh"  Click="RefreshButton_Clicked">
                <Image Source="Images\refresh.gif" Height="16" Width="16"></Image>
            </Button>
            <Button Name="EditXml">
                <Image Source="Images\edit-xml.png" Height="16" Width="16"></Image>
            </Button>
            <Button Name="About">
                <Image Source="Images\about.png" Height="16" Width="16"></Image>
            </Button>
            <Button Name="Help">
                <Image Source="Images\help.png" Height="16" Width="16"></Image>
            </Button>
        </ToolBar>

    </Grid>
</UserControl>

为了把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;

/// <summary> /// Using Singleton pattern to make sure there'll be only one instance of this class. /// </summary> 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;
}

}

/// <summary> /// Show or hide the UI. /// </summary> 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下载自己测试一下。http://code.google.com/p/map-resource-explorer/
 
Cheers,
峻祁连
 
作者: 峻祁连
邮箱:junqilian@163.com 
出处: http://junqilian.cnblogs.com 
转载请保留此信息。


本文转自峻祁连. Moving to Cloud/Mobile博客园博客,原文链接:http://www.cnblogs.com/junqilian/archive/2011/02/07/1949621.html ,如需转载请自行联系原作者
相关文章
|
7月前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
106 3
|
定位技术
百度地图开发:map.setViewport让标注显示在最佳视野内
百度地图开发:map.setViewport让标注显示在最佳视野内
343 0
|
机器学习/深度学习 定位技术 容器
百度地图高级开发:map.getDistance计算多点之间的距离并输入矩阵
百度地图高级开发:map.getDistance计算多点之间的距离并输入矩阵
291 0
|
2月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
72 2
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
这篇文章详细解释了在IntelliJ IDEA中如何使用Mute Breakpoints功能来快速跳过程序中的后续断点,并展示了如何一键清空所有设置的断点。
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
|
4月前
|
Java Serverless Go
Golang 开发函数计算问题之在 Golang 中避免 "concurrent map writes" 异常如何解决
Golang 开发函数计算问题之在 Golang 中避免 "concurrent map writes" 异常如何解决
|
5月前
|
JavaScript 定位技术
vue-baidu-map 绘制行政区划的轮廓,添加行政区划名称(含给覆盖物添加点击事件)——vue 百度地图开发
vue-baidu-map 绘制行政区划的轮廓,添加行政区划名称(含给覆盖物添加点击事件)——vue 百度地图开发
269 1
|
5月前
|
JavaScript 定位技术
vue 百度地图开发【教程】1. 绘制百度地图(不使用 vue-baidu-map,解决 BMap is undefined)
vue 百度地图开发【教程】1. 绘制百度地图(不使用 vue-baidu-map,解决 BMap is undefined)
433 0
|
6月前
|
存储 Java 数据处理
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【6月更文挑战第18天】在Java中,HashMap基于哈希表提供快速的键值对操作,适合无序数据;而TreeMap利用红黑树保证排序,适用于有序场景。示例展示了HashMap如何存储并查找用户信息,以及TreeMap如何按员工编号排序存储员工名。两者在不同需求下优化了数据处理。
162 0
|
7月前
|
JavaScript
webpack-devtool选项 --生成source-map便于开发调试(二)
webpack-devtool选项 --生成source-map便于开发调试(二)
225 0