【问题标题】:WPF and events from dynamically created controlsWPF 和来自动态创建的控件的事件
【发布时间】:2026-02-10 07:35:01
【问题描述】:

我需要一些帮助来实现某些控件中的常见行为。

在我的 WPF 应用程序中,我有一个包含面板和按钮的主窗体:

好的

单击该按钮将运行 Save 方法。Save 方法从表单中读取一些数据并将数据保存到数据库中。

面板填充有动态创建的控件(例如文本框、下拉列表等)。主窗体实例化一个 MainViewModel 类。这个 MainViewModel 类实例化了一个名为 UIFactory 的类。所以我们这里有 3 个级别。

在 UIFactory 类中,正在创建控件。主窗体中的 Panel 作为参数发送到 MainModelView 类中名为 GenerateUI 的方法。 MainViewModel 类中的此 GenerateUI 方法调用 UIFactory 类上的 GenerateControls 方法,该方法将相同的面板作为参数。 UIFactory 类中的 GenerateControls 方法然后在面板上添加动态创建的控件。

我想要实现的是,每当用户在输入其中一个动态创建的控件(例如文本框)时按 ENTER,我希望该行为与单击主窗体中的按钮相同。但是我该怎么做呢?我想在我的控件上实现路由事件,但我不知道该怎么做。你能告诉我如何实现我的目标吗?

最好的问候,

OKB

【问题讨论】:

    标签: wpf events controls routed


    【解决方案1】:

    也许Keyboard.KeyUp 附加事件可能会对您有所帮助。您可以在包含动态创建的控件的主面板上设置它,然后如果按下的键是 ENTER 键,则执行保存操作。

    【讨论】:

      【解决方案2】:

      我确实设法针对我的问题创建了一个工作:

      我所做的是创建一个自定义用户控件(我们称之为容器)。此控件使用 WindowsFormsHost 而不是面板托管在我的 wpf 应用程序中。然后我将动态创建的用户控件添加到我的新自定义用户控件(容器)中,并在每个子控件的 KeyUp 事件上添加一个 KeyEventHandler。 我在我的容器中创建了一个自定义事件和事件处理程序,它将捕获来自子控件的所有 KeyUp 事件,检查 e.KeyValue == 13 (ENTER),然后从将在我的 wpf 中处理的容器中引发我的自定义事件形式。丑得像 h*ll,但它有效。

      【讨论】: