如何从另一个表单引用我的 Bing 地图元素?

如何解决如何从另一个表单引用我的 Bing 地图元素?

我在 UserControl1.xaml 文件中有一个 Bing Map 元素:

<UserControl x:Class="MyMaps.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:m="clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF">
    <Grid>
        <m:Map CredentialsProvider="Gr8GooglyMoogly" x:Name="myMap" />
    </Grid>
</UserControl>

我可以像这样从它所在的 Form1 访问它:

this.userControl11.myMap.Mode = new RoadMode();

...但是当我尝试从另一个表单访问它时,这些尝试都不起作用:

userControl11.myMap.Children.Add(pin); // does not exist in the current context
Form1.userControl11.myMap.Children.Add(pin); // inaccessible due to its protection level
UserControl1.myMap.Children.Add(pin); // object reference is required for the static field,...

如何从另一个表单获取 UserControl 的句柄?

更新

使用 Reza 的评论将地图的 Modifier 属性从 Private 更改为 Public,并利用 the link provided 中显示的方法,以下工作:

var frmMain = new Form1();
frmMain.userControl11.myMap.Children.Add(pin);

更新 2

Reza 的想法很完美。这是我测试它以验证的方式:

在“表格 2”(mdlDlgFrm_AddNewLocation)中:

// to access map on main form (Form1)
private Form1 frmMain;

// second constructor so as to access map on main form (to add pushpins)
public mdlDlgFrm_AddNewLocation(Form1 f1)
{
    InitializeComponent();
    this.frmMain = f1;
    // test
    AddPushpin("blaJustATest");
}

private void AddPushpin(string fullAddress)
{
    Pushpin pin = new Pushpin();
    // "brute-forcing" the coordinates for this test
    pin.Location = new Location(37.1481402218342,-119.644248783588); // Interesting location: out in the "boondocks" between Oakhurst and Auberry
    this.frmMain.userControl11.myMap.Children.Add(pin);
}

...以及从主表单(表单 1)调用的“表单 2”:

private void addLocationToolStripMenuItem_Click(object sender,EventArgs e)
{
    mdlDlgFrm_AddNewLocation frmAddNewLocation = new mdlDlgFrm_AddNewLocation(this);
    frmAddNewLocation.ShowDialog(this);
    frmAddNewLocation.Dispose()
}

解决方法

当您创建新表单时,您必须将当前表单作为参数发送给新表单的创建者,在那里您可以使用您提交的实例对该实例进行更改。

,

除了我在 linked post 中已经解释并在其他帖子中提到的所有选项(包括我在评论中提到的选项)之外,您还可以在此处考虑以下选项:>

  1. 如果您使用 const LineChart = () => { ... function toggleLiveData() { if (!intervalRef) { setIntervalRef( setInterval(() => { if (chartComponent.current) { chartComponent.current.chart.series[0].addPoint( Math.random(),true,false ); } },500) ); } else { clearInterval(intervalRef); setIntervalRef(null); } } return ( <div> <HighchartsReact ref={chartComponent} highcharts={Highcharts} options={chartOptions} /> </div> ); }; 来显示 ShowDialog,则不需要对 Map 或 Form1 的引用。只需从 Form2 返回 Pushpin 并使用它。
  2. OR 只需将依赖项 Form2 传递给您的第二个表单。 (无需公开用户控件或传递整个 form1)。

示例 1 - 返回图钉

如果您使用 ShowDialog 来显示 Form2,则在 Map 中不需要 Map。只需创建 Form2 并将其返回给 Pushpin 并在那里使用它。

  1. Form1 中,定义一个 Form2 属性:

    Pin
  2. //using Microsoft.Maps.MapControl.WPF; //... public Pushpin Pin {get; set;} 中,当您要创建 Form2 时,将其分配给 Pushpin 属性:

    Pin
  3. 然后在 //... this.Pin = new Pushpin(){Location = location}; this.DialogResult = DialogResult.OK; 中,当您想显示 Form1 时:

    Form2

示例 2 - 传递地图

只需将依赖项 Map 传递给您的第二个表单。您不需要将用户控件设为公开或不需要传递整个 form1:

  1. 更改 using(var f2 = new Form2()) { if(f2.ShowDialog() == DialogResult.OK) { this.userControl11.myMap.Children.Add(f2.Pin); } } 构造函数以接受 Map:

    Form2
  2. //using Microsoft.Maps.MapControl.WPF; //... private Map map; public Form2(Map map) { InitializeComponent(); this.map = map; } 中,当您想显示 Form1 时:

    Form2
  3. var map = this.userControl11.myMap; using(var f2 = new Form2(map)) f2.ShowDialog(); 中,当您想使用地图时:

    Form2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-