如何使用“ SharpMap” WPF控件

时间:2018-08-31 18:30:31

标签: c# wpf sharpmap

我想在WPF应用程序中使用SharpMap,但是我不知道如何使用此控件。到目前为止,这是我一直尝试的方法,也是我所面临的死胡同。

使用Github上的WPFExample: SharpMap on GitHub

首先,我尝试在VS Community 2017中打开SharpMap.Sln。由于剪切的错误数量,我无法构建应用程序。请参见下面的屏幕截图。我尝试重新安装所有nuget软件包,没有任何变化,清理,构建等,但没有任何乐趣。列出太多错误,这些错误主要与缺少名称空间等有关。

然后,我再次尝试仅打开WPFSamples项目,重新安装Nuget程序包,并最终添加所有其他引用的项目,但这只会使错误列表更长。

然后我尝试启动一个新的WPF应用程序并添加以下Nuget包:

  1. SharpMaps

  2. SharpMaps.UI

,然后从GitHub上的示例调试文件夹中手动添加SharpMaps.UI.Wpf.dll。我使用的XAML如下。后面没有代码。该解决方案将构建为没有错误,但是,当我尝试运行该解决方案时,它会出现以下错误:

  

System.Windows.Markup.XamlParseException:''的调用   类型“ SharpMap.UI.WPF.SharpMapHost”上的构造函数   指定的约束条件引发了异常。”行号“ 30”   和线位置“ 10”。 TypeLoadException:无法加载类型   程序集'SharpMap,Version = 1.0.0.0中的'SharpMap.Layers.ILayer',   Culture = neutral,PublicKeyToken = null”。

所以我的问题是:

1.我缺少哪些步骤阻止GitHub中的示例WPF SharpMap项目正常工作(打开VS时没有错误)? 现在已解决。尽管使用VS2017,但仅安装了.NET 4.6.1,将.NET 7.2加起来解决了该问题。没有警告说它指向了错误的框架版本,因此解决这个问题只是运气。

  1. 为了使准系统SharpMap正常工作,我在下面的代码中缺少什么? 不幸的是,该文档缺乏WPF支持,我找不到其他示例,因此从这里开始将是反复试验。

XAML:

<Window x:Class="SharpMap.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:SharpMap"
    xmlns:smh="clr-namespace:SharpMap.UI.WPF;assembly=SharpMap.UI.WPF"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">

<Grid Name="grid1">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="*"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
    </Grid.RowDefinitions>
    <Menu Grid.Row="0" Name="Menu">
        <MenuItem Header="_File">
            <MenuItem Header="_Exit"/>
        </MenuItem>
        <MenuItem Header="_Add Layer">
            <MenuItem Header="_ShapeFile" Name="AddShapeLayer"/>
        </MenuItem>
        <MenuItem Header="_BackgroundMap">
            <MenuItem Header="_OpenStreetMap" Name="BgOsm" />
            <MenuItem Header="_MapQuest" Name="BgMapQuest" />
        </MenuItem>
    </Menu>

    <smh:SharpMapHost Name="WpfMap" Grid.Row="1"></smh:SharpMapHost>
    <StatusBar Grid.Row="2">
        <StatusBarItem Name="Coordinates" HorizontalAlignment="Right">
            <Label Content="{Binding CurrentMouseCoordinateString, ElementName=WpfMap, UpdateSourceTrigger=PropertyChanged}"></Label>
        </StatusBarItem>
    </StatusBar>
</Grid>
</Window>

为完整起见,后面的代码(实际上没有任何更改)

using System;
using System.Windows;
using System.Windows.Forms;
using SharpMap;
using SharpMap.Forms;
using GeoAPI.Geometries;
using Application = System.Windows.Application;
using MenuItem = System.Windows.Controls.MenuItem;

namespace SharpMap
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();


        }

    }
}

编辑:

我还尝试过使用使用SharpMap并支持WPF的MapSui,但是我仍然发现我无法在GitHub上运行示例,文档也无法用于构建示例。

编辑2:

好,所以我根本无法在WPF应用程序中使用SharpMap。自更新.NET框架以来,我重新访问了MapSui,并发现示例按预期工作。然后,我使用以下简单指南将MapSui应用于我的项目: MapSui Startup Guide,而且效果很好。我仍然认为我的问题应该为其他想使用WPF和SHarpMap的人提供答案,但是,我将继续使用MapSui。

1 个答案:

答案 0 :(得分:0)

关于问题1,我还升级到了.Net 7.2,但它没有更改,我的WinformHost仍然不可见。 我终于明白了为什么:我的主窗口有一个“ AllowsTransparency = True”参数。只是阻止了WinformHost的显示...将其更改为False即可使用。