【问题标题】:How to load and refresh user control on button click如何在按钮单击时加载和刷新用户控件
【发布时间】:2012-05-28 18:29:13
【问题描述】:

我有一个 Windows 窗体应用程序,窗体上的控件之一是 WPF 用户控件。 我已将元素宿主控件放在 Windows 窗体上,这是在启动时加载我的用户控件。

我想要的是在特定时间加载和刷新用户控件。因为我需要加载新数据。

我已经尝试过elementHost1.Refresh();,但这并没有做任何事情。

如何加载和刷新它?

这是我对此LINK的用户控制

【问题讨论】:

  • 伙计们,如果您创建新的 windows 窗体项目并插入我的代码和 rss lnk 并尝试在按钮单击时刷新它,您可以简单地尝试一下。
  • 我就是这么做的。将一个(Windows 窗体)按钮插入到您的 Windows 窗体中,并将​​我的两行代码添加到按钮单击处理程序中,您可以在下面看到它们。信不信由你,它有效。

标签: c# wpf user-controls load refresh


【解决方案1】:

让数据提供者重新读取其来源:

var dataprovider = (System.Windows.Data.XmlDataProvider) (
  ((UserControl1) (elementHost1.Child)).Resources ["rssData"]
);
dataprovider.Refresh ();

【讨论】:

  • 我会尝试并让您知道。你测试过吗?
  • 部分。 UserControl1 应该是您的 UserControl 的类。
  • 我只从工具箱中添加了一个 elementhost 我还没有手动创建它,因为这个 wpfs 对我来说完全是新的
  • 你不需要手动创建它;您的 windows 窗体类将包含一个代表元素主机的成员;顺便提一句。我已经试过了,效果很好
  • 知道为什么当我将链接放入 [ ] 时会出现 null 异常吗
【解决方案2】:

当您再次调用加载事件时会发生什么?

或者至少是您用于在表单中填充数据的方法>

即要么打电话给你的this.Load(null,null)(或者根据需要传递一些对象或事件)

private void form1_load(object o, EventArgs e)
{
    BindDataToControlMethod();
}

或者重构你的代码,这样你就可以调用你的 BindDataToControlMethod() 方法。

您正在进行的elementHost1.Refresh() 调用只是在屏幕上重新绘制表单。它本身不会重新加载。

【讨论】:

  • 这是一个通过工具箱加载的控件,这个用户控件只是我屏幕的一部分,它有一个 rss 数据,然后我有一个按钮,例如将用作刷新。我不想只加载调用用户控件的一小部分表单。那就是问题所在。如果这是全屏模式,那么我将加载所有表单并完成。
  • 我认为您可以将与整个表单相同的逻辑应用于用户控件。两者都是可以重新实例化的对象。如果您在拨打电话时需要过滤结果,则必须自己进行,因为这里没有足够的信息可供我尝试。
  • 告诉我你需要什么,因为我不明白你在说什么。所以我有一个按钮和用户控件,它通过 Windows 窗体设计器上的工具箱加载到 elementHost1 中。这就是我所拥有的,因为我想尝试它是如何工作的。您需要用户控制代码吗?
  • 当您的表单加载时,您将加载您的 ElementHost。在其中加载您个人生成的 userControl。到目前为止是正确的吗?加载时如何将数据放入用户控件?
  • 我已经编写了 usercontrol 并且我已经制作了文件并且它在我的项目中。我已经从工具箱中添加了 elementhost,如果您创建了一个,它可以选择加载 wpf 文件。所以基本上这是在表单启动时加载的。在我加载 Drom RSS 链接之前加载数据
【解决方案3】:

MVVMINotifyPropertyChanged 呢? 使用INotifyPropertyChanged,您可以在数据发生更改时通知 View 并以这种方式刷新它。看来这就是你想要的。


查看几个相关链接:

【讨论】:

  • 那是非常好的文章。但这是针对用 c# 编写的用户表单。我已经创建了表单作为用户控件,它只加载到 elementhost 控件中。我想在按下按钮时刷新它。
  • 我添加了可以看到用户控件代码的链接
【解决方案4】:

由于您的控件不会自动刷新,我假设您不使用数据绑定,这可能是最好的解决方案。

假设您有一个(自定义)类型 UserControl1 的用户控件,其中包含一个名为 MyButton 的按钮。

您可以创建一个新的 WPF 控件并将其分配给子元素,例如

((UserControl1) (elementHost1.Child)).MyButton = new System.Windows.Button ()

或者你访问 WPF 控件如下

var wpfButton = ((UserControl1) (elementHost1.Child)).MyButton;

然后简单地重置 WPF 控件的必要属性:

wpfButton.Content = "My new text";

编辑:错误已更正。

【讨论】:

  • 我有数据绑定,因为这个用户控件是 rss 阅读器,所以我有数据绑定。我只想在单击按钮时刷新
  • 我已经添加了可以看到用户控件代码的链接
  • 但是您可能希望更新 XML 数据提供程序,而不是您的控件之一???为数据提供者命名,通过 elementHost1.Child ["数据提供者的名称"] 访问它,将其转换为 XmlDataProvider 并在数据提供者上调用 Refresh()!请参阅我的其他帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 2021-12-30
  • 2011-08-10
  • 1970-01-01
相关资源
最近更新 更多