C# 检测控件上的默认按钮

C# 检测控件上的默认按钮,c#,wpf,event-handling,custom-controls,defaultbutton,C#,Wpf,Event Handling,Custom Controls,Defaultbutton,这看起来很简单,但是我在web上找不到任何关于我想添加到自定义控件中的行为的信息 我的自定义控件是一个带有选项列表的文本框。当用户输入的文本不是列表的一部分时,将出现一个弹出窗口,该列表允许用户选择正确的选项 有时,在添加了自定义控件的容器上可能会有一个默认按钮。如果是,当按下enter键时,如果文本错误,则必须显示弹出窗口。如果没有默认按钮,则在回车时,即使文本错误,也不必执行任何操作 为了能够创建这种行为,我必须能够检测容器中是否存在defaultbutton,并且必须在cutom控件的c代

这看起来很简单,但是我在web上找不到任何关于我想添加到自定义控件中的行为的信息

我的自定义控件是一个带有选项列表的文本框。当用户输入的文本不是列表的一部分时,将出现一个弹出窗口,该列表允许用户选择正确的选项

有时,在添加了自定义控件的容器上可能会有一个默认按钮。如果是,当按下enter键时,如果文本错误,则必须显示弹出窗口。如果没有默认按钮,则在回车时,即使文本错误,也不必执行任何操作

为了能够创建这种行为,我必须能够检测容器中是否存在defaultbutton,并且必须在cutom控件的c代码中完成

我希望描述足够清楚。
提前感谢

您是否考虑过实现MVVM方法和命令模式?只要视图模型知道选项是什么,就可以将默认按钮绑定到命令。只要命令CanExecute处理程序返回false,即未输入/选择适当的选项,按钮将被禁用,并且不会响应用户按enter键。

您是否考虑过实施MVVM方法和命令模式?只要视图模型知道选项是什么,就可以将默认按钮绑定到命令。只要命令CanExecute handler返回false,即未输入/选择适当的选项,按钮将被禁用,并且不会响应用户按enter键。

因为我无法知道我从自定义控件中选择的其他控件是什么,我选择如下:

我使用FrameworkElement.parent创建了一个递归函数来查找第一个父级 有了父控件,我可以查看它包含的每个控件。 当我看到一个按钮时,我必须验证是否默认。 对于本例,我使用了VisualTreeHelper GetChildrenCountDependencyObject对象的父对象和GetChildDependencyObject对象的父对象int childIndex。递归性再一次


尽管这意味着要执行更多的代码,但它仍然工作得很好。

因为我无法知道自定义控件中还有哪些其他控件,所以我选择如下方式:

我使用FrameworkElement.parent创建了一个递归函数来查找第一个父级 有了父控件,我可以查看它包含的每个控件。 当我看到一个按钮时,我必须验证是否默认。 对于本例,我使用了VisualTreeHelper GetChildrenCountDependencyObject对象的父对象和GetChildDependencyObject对象的父对象int childIndex。递归性再一次


尽管这意味着需要执行更多的代码,但它仍然工作得很好。

我想我解释错了。一方面,我们有一个默认的按钮,它甚至可能不在那里,并且可以做其他的事情。另一方面,我们有一个自定义控件,它需要正确的值,并且不允许用户在选择正确的值之前离开它。如果用户试图离开控件并输入了错误的值,将显示一个列表。这些行动之间没有太多的联系。关键是当存在默认按钮时,如果enter上的文本错误,则触发列表。如果没有默认按钮,列表将不会显示在enter上,因为它没有效果。我想我解释错了。一方面,我们有一个默认的按钮,它甚至可能不在那里,并且可以做其他的事情。另一方面,我们有一个自定义控件,它需要正确的值,并且不允许用户在选择正确的值之前离开它。如果用户试图离开控件并输入了错误的值,将显示一个列表。这些行动之间没有太多的联系。关键是当存在默认按钮时,如果enter上的文本错误,则触发列表。如果没有默认按钮,列表将不会显示在enter上,因为它不起作用。