InitializeComponent() 调用另一个方法

Posted

技术标签:

【中文标题】InitializeComponent() 调用另一个方法【英文标题】:InitializeComponent() calling another method 【发布时间】:2018-12-15 06:03:08 【问题描述】:

当我将 SelectionChanged 事件以及代码中处理事件的方法添加到以下组合框时:

....

<ComboBox Name="OrderBox" HorizontalAlignment="Left" SelectionChanged="OrderBox_OnSelectionChanged">
       <ComboBoxItem Margin="4,4,4,4" IsSelected="True">Por Nombre (A - Z)</ComboBoxItem>
       <ComboBoxItem Margin="4,4,4,4">Por Nombre (Z - A)</ComboBoxItem>
       <ComboBoxItem Margin="4,4,4,4">Por Apellido (A - Z)</ComboBoxItem>
       <ComboBoxItem Margin="4,4,4,4">Por Apellido (Z - A)</ComboBoxItem>
</ComboBox>

....

我看到在控件未初始化错误后调试应用程序,当应用程序调用 InitializeComponent() 时,它做的第一件事就是调用我的组合框事件处理程序方法 (OrderBox_OnSelectionChanged() )。所以我不能真正使用组合框的事件,因为之后每个控制器都会被加载。

如果我从组合框 xaml 和事件处理程序中删除事件,即使我有更多事件处理程序,错误也不会发生,只是由于某种我看不到的原因调用那个。

代码就这么简单:

public MainWindow()

     InitializeComponent(); //FROM HERE IT GOES TO OrderBox_OnSelectionChanged()
     Displayer();


private void OrderBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)




....

希望你知道我做错了什么。

【问题讨论】:

初始化时,组合框复选框将从未设置更改为您的初始值。这是因为它们不能取消设置。没有办法避免调用事件处理程序。 【参考方案1】:

OrderBox.SelectionChanged+=OrderBox_OnSelectionChanged; 放入MainWindow 构造函数中,并在您的xaml 中删除SelectionChanged 属性。

【讨论】:

现在可以使用了,非常感谢先生。虽然为什么 xaml 组合框中的事件会使构造函数在其他所有内容之前加载该精确事件方法? 它运行事件,因为您的 xaml 代码指定在启动时选择了哪个项目,因此它会更改 SelectedItem 然后调用事件。此外,您通常不会在 *** 上写“先生”。【参考方案2】:

当使用InitializeComponent(); 加载表单时,该页面上的组合框(通常)设置为(通常)其索引为 -1 的项目,除非您另有明确设置。无论哪种方式,当表单初始化并且SelectionChanged 事件命中时,选定的项目都会更改为其默认值。您可以通过放置一行错误处理来解决被命中的事件:

private void OrderBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)

    if (OrderBox.SelectedItem != null)
    
        //your code
    

【讨论】:

经过测试,调用也进入了if条件,所以不能这样工作..prntscr.com/k3e18o @SaFteiNZz 抱歉,我没有看到您在 XAML 中设置了选定项 我自己也忘记了,没有选择 和 SelectedIndex="-1" 作为它起作用的组合框的属性。 @SaFteiNZz 太棒了!如果您未将组合框项目作为 Selected 发送,则无需将所选索引明确声明为 -1,尽管这样做总是更安全。

以上是关于InitializeComponent() 调用另一个方法的主要内容,如果未能解决你的问题,请参考以下文章

Winform启动另一个项目传值的方法

vb.net求大神解释

c# winform 调用js

如何实现我另一个窗口关闭时,刷新这个窗口(C#中问题)

C# winform 在一个窗体中如何设置另一个窗体的TextBox的值

使用另一个类c#中的类