Windows服务中的DexExpress XPF Map

时间:2015-08-26 10:34:37

标签: c# wpf dictionary devexpress

我正在使用DexExpress.Xpf.Map.v15.1 MapControl并尝试创建能够在Windows服务(即无前端)中运行的代码,以生成地图作为图像。

我有以下代码创建地图,将GeoPoints添加到PolyLine,然后将PolyLine添加到地图中。这在我的WPF测试工具应用程序中工作正常:

 public MapWindow1()
        {
            InitializeComponent();

            var mapControl = new MapControl
            {
                Name = "TheMap",
                ZoomLevel = 4,
                CenterPoint = new GeoPoint(47, 5)
            };

            var imageLayer = new ImageTilesLayer
            {
                DataProvider = new OpenStreetMapDataProvider()
            };
            mapControl.Layers.Add(imageLayer);

            var vectorLayer = new VectorLayer();
            mapControl.Layers.Add(vectorLayer);
            var mapItemStorage = new MapItemStorage();
            vectorLayer.Data = mapItemStorage;

            var polyLineCollection = DbfGenerator.GeneratePolyLineCollection();

            polyLineCollection.ForEach(line =>
            {
                var mapItem = new MapPolyline();
                mapItemStorage.Items.Add(mapItem);
                mapItem.Points.AddRange(line);
            });
            mapControl.MouseDoubleClick += mapControl_MouseDoubleClick;

            MainGrid.Children.Add(mapControl);

        }

这会运行并将地图控件添加到WPF页面而不会出现问题。然后我添加了双击处理程序以将地图导出为图像:

void mapControl_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            var m = GenerateMapPng((MapControl) sender);
            m.Save(@"C:\0Temp\test.bmp");
        }

 public Bitmap GenerateMapPng(MapControl map)
    {
        Bitmap bmp;
        // export image from map
        using (MemoryStream ms = new MemoryStream())
        {
            var exportOptions = new ImageExportOptions(ImageFormat.Png);
            map.ExportToImage(ms, exportOptions);


            ms.Position = 0;
            bmp = new Bitmap(System.Drawing.Image.FromStream(ms));
        }
        return bmp;
    }

再次 - 这没有问题。 但是,如果我删除UI元素并运行以下代码:

public MapWindow1()
{
    InitializeComponent();


    var mapControl = new MapControl
    {
        Name = "TheMap",
        ZoomLevel = 4,
        CenterPoint = new GeoPoint(47, 5)
    };


    var imageLayer = new ImageTilesLayer
    {
        DataProvider = new OpenStreetMapDataProvider()
    };
    mapControl.Layers.Add(imageLayer);

    var vectorLayer = new VectorLayer();
    mapControl.Layers.Add(vectorLayer);
    var mapItemStorage = new MapItemStorage();
    vectorLayer.Data = mapItemStorage;

    var polyLineCollection = DbfGenerator.GeneratePolyLineCollection();

    polyLineCollection.ForEach(line =>
    {
        var mapItem = new MapPolyline();
        mapItemStorage.Items.Add(mapItem);
        mapItem.Points.AddRange(line);
    });

    var m = GenerateMapPng(mapControl);
    m.Save(@"C:\0Temp\test.bmp");

}

我在“map.ExportToImage(ms, exportOptions);”行上收到NullReferenceException。

我假设当WPF应用程序加载它时调用一个方法来初始化地图,但我找不到任何我可以手动对控件(Load / Init方法)进行模仿的方法。

有没有办法让MapControl认为它不在WPF页面中?

1 个答案:

答案 0 :(得分:0)

DevExpress表示,由于地图依赖于WPF中的UI线程,这是不可能的。