【问题标题】:Why usercontrols loaded event is not fired为什么不触发用户控件加载事件
【发布时间】:2011-10-01 02:27:17
【问题描述】:

我有一个用户控件。我有时再次遇到这种情况,但总是可以通过使用“New() contructor”来解决它。但是我仍然想知道我做错了什么,因为如果加载了控件,则必须触发 load 事件

这里有一些代码:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:OUTPUT___VideoContent"
    Title="OUTPUT - VideoContent" Height="350" Width="525" Icon="/OUTPUT%20-%20VideoContent;component/Images/VideoContent.png">
    <Grid x:Name="LayoutRoot">
        <Grid x:Name="VideoGrid">
            <my:ucVideoPresenter x:Name="VideoPresenter1"/>
            <TextBlock x:Name="txtInfo" Visibility="Collapsed" />
        </Grid>
    </Grid>
</Window>

在用户控件中,加载事件在 WPF 或 codebehing 上声明,但没有任何成功!

【问题讨论】:

  • 你有没有发现问题出在哪里?我目前面临同样的问题。
  • 不,我没有。我在 LayoutUpdated 事件中使用了自己的 booelan 来检查控件是否是第一次绘制的。在那种情况下,我会初始化一些东西,就像我在 Load 事件中做的那样。
  • 该解决方案并不健康。其原因通常是在组件初始化期间引发的异常,并且在控件完成加载之前有效地停止初始化。除非您将初始化放在 try/catch 中,否则不会处理此类异常。而且你不会在调试器中注意到它,除了副作用是所有在异常之后初始化的控制器永远不会完全加载。因此,它们的加载事件永远不会被触发。您应该检查所有初始化代码是否存在异常,例如通过单步执行代码。

标签: wpf events event-handling load code-behind


【解决方案1】:

你的 UserControl 构造函数是否仍然调用InitializeComponent(),没有这个,它不会建立它的视觉效果并且Loaded 事件可能不会触发。

【讨论】:

  • InitializeComponent() 已正确完成。加载时用户控件没有异常。
【解决方案2】:

这是因为在“已加载”事件处理程序中引发了异常。该异常可能是由于混合模式程序集或“用户处理”的其他一些异常而发生的,并且 WPF 框架正在捕获它(调试器未知)。这会导致调试器在 Loaded 方法中设置断点时不会中断。

为了确保您可以准确地看到正在发生的错误:

  1. 在 VS2010 中转到调试 |例外情况。
  2. 勾选“抛出”例外单选框,了解可能适用于您的情况的例外情况。
  3. 重新运行应用程序,VS2010 应该会在事件处理程序中抛出的异常中断。
  4. 根据现在已知的异常进行调试。

【讨论】:

  • 您知道如何添加事件处理程序“未触发”异常吗? “添加”选项没有为事件提供任何准备好的界限,或者“System.Windows.Input”附近没有任何东西。
猜你喜欢
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
相关资源
最近更新 更多