最近开发的一套系统中,在检查开发成员的代码时候,在Loaded事件中加上以下语句:

this.Loaded -= new RoutedEventHandler(***_Loaded);这让我觉得有些奇怪。如是参照系统中的代码逻辑写了一个demo。

MainWindow代码如下:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
TabItem item = new TabItem();
UserControl1 test = new UserControl1();
item.Header = "测试。。。";
item.Content = test;
item.IsSelected = true;
tbc.Items.Add(item);
}

UserControl1再加载一个UserControl2,前台代码如下,后台没有代码:

<Grid x:Name="detailGrid">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5*"/>
<ColumnDefinition Width="4"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ScrollViewer Grid.Column="2">
<StackPanel>
<my:UserControl2 Margin="3" />
</StackPanel>
</ScrollViewer>

</Grid>

UserControl2 的代码如下:

前台:

<UserControl x:Class="两次Loaded事件.UserControl2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" Loaded="UserControl_Loaded">

<Grid>
<Expander ExpandDirection="Down" IsExpanded="True" x:Name="grpRunInfo">
<Expander.Header>
<TextBlock Text="运行信息"/>
</Expander.Header>
<Expander.Content>
<ScrollViewer Name="scrollViewer1" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Button Content="第二层" Height="60" Name="button1" Width="123" />
</ScrollViewer>
</Expander.Content>
</Expander>
</Grid>

</UserControl>

后台:

public partial class UserControl2 : UserControl
{
public UserControl2()
{
InitializeComponent();
}

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
Console.WriteLine("调用uc的loaded");
if (this.IsLoaded)
{
string s = string.Empty;
}
else
{
string b = string.Empty;
}
}
}

就这样简单的一些代码出现了一个奇怪的问题;Usercontrol2的Loaded事件走两次,检查后发现以为是item.IsSelected = true;这句代码让Loaded事件跑了第二遍,其实不然,把这句代码注释掉Usercontrol2的Loaded事件仍然跑两遍。这就头大了,向各群里的同行求助,都没有找到原因或是原因不正确。最后自己挨个检查,发现是Usercontrol1的ScrollViewer控件有问题,把<ScrollViewer Grid.Column="2">这层注释,只留下<StackPanel>这层就不会走两遍UserControl2的Loaded事件。个人理解是不是ScrollViewer加载控件导致UserControl2的Loaded事件走了第二遍,没高人指点就只能这样去理解了。正在这时我把demo发给群里的一哥们有了回复,他说没有我碰到的问题,就只走了一次,这就让我纳闷了,我以为是他没有理解我说的问题或者是我说的问题没有描述清楚。既然我已经知道原因了就没太在意。打算跟开发人员说问题所在并且如何修改。这时候又一之前讨论的人有了回复也说没有碰到我说的问题,他说是不是我的ide有问题,让我重装,我说我用的是vs2010,他说他用的是vs2012;难道是这个原因?又去问前一个说没有碰到问题的人,他也说是用的vs2012。我就问他的编译环境是不是用的.net4.5,他说是4.0;我说我也是用的4.0应该不存在问题的啊;如是我自己下载了一个2013安装并测试,也用的是.net4.0;同样的demo果然没有出现Loaded事件走两次。不理解原因所在,请高手指点。

WPF Loaded事件连续调用两次的问题的更多相关文章

  1. javascript onclick事件可以调用两个方法吗?

    答案是:可以的,onclick事件可以调用多个方法,每个方法之间用分号(:)隔开即可. onclick后面其实是可以写任何代码的,但是一般不建议这么写!! 例:onclick="fun1() ...

  2. 连续调用inet_ntoa打印出错的问题

    近日写程序,在打印信息的时候调用了inet_ntoa函数,出现了打印一直出错的情况.google了一下,是因为inet_ntoa这类函数没有保证线程安全,其实现原理是在静态内容中申请一块内存,每次调用 ...

  3. spring中配置quartz调用两次及项目日志log4j不能每天生成日志解决方法

    在quartz中配置了一个方法运行时会连续调用两次,是因为加载两次,只需在tomcat的server.xml中修改配置 <Host name="www.xx.cn" appB ...

  4. vs2010 和vs2012的区别 副标题--Loaded事件走两次

    我上一遍博文没有通过首页显示!这边就简短的描述一下问题,希望大拿们有遇到类似问题或者知道原因的回答一下下!!! 最终的问题是Loaded事件走两次,具体可以看我上一篇对问题的描述. 在目标框架同样都是 ...

  5. wpf 的依赖属性只能在loaded 事件之后才能取到

    wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的  InitializeComponent(); 之后取不到 wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的  ...

  6. keydown事件下调用trigger事件执行两次

    $('button[type=button]').on('click',login); //登录 $(document).keydown(function(event){ if(event.keyCo ...

  7. WPF 委托 事件 B窗体调用A窗体方法

    原文:WPF 委托 事件 B窗体调用A窗体方法 具体实现 A窗体 中加载B窗体  B窗体触发A窗体里的方法 当点击B窗体确定Button事件   给A窗体俩个TextBox赋值 并关闭B窗体 B窗体 ...

  8. WPF 在事件中绑定命令(不可以在模版中绑定命令)

    其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中. 上一篇中我们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是 ...

  9. WPF路由事件二:路由事件的三种策略

    一.什么是路由事件 路由事件是一种可以针对元素树中的多个侦听器而不是仅仅针对引发该事件的对象调用处理程序的事件.路由事件是一个CLR事件. 路由事件与一般事件的区别在于:路由事件是一种用于元素树的事件 ...

随机推荐

  1. jQuery的input 失去焦点之后,不能再获取到焦点

    今天写了一个字段唯一性校验功能,验证设备仪器编号唯一,当输入编号之后 ,点击其他,失去焦点后,后台验证唯一,有过此编号,就给出提示,重新填写. 当使用ie时候,获取焦点正常 ,但是使用火狐就获取不到焦 ...

  2. 【随笔】js加载

    有时候,当发现js操作一个dom的时候,发现dom没有找到,这是由于html没有加载完就开始操作该dom的缘故,所以需要在html文档加载完后再加载js,于是我们可以这么做: js方法:window. ...

  3. 选择本地照片之后即显示在Img中(客户体验)

    最近转战MVC项目,然后又再次遇到照片上传的实现,之前都是使用ASP.NET,虽然也有照片上传,而且出于客户体验考虑, 也实现了选择本地照片之后即时显示在IMG中,在这里就简单介绍其实现(ASP.NE ...

  4. INI配置文件分析小例子

    随手写个解析INI配置字符串的小例子 带测试 #include <iostream> #include <map> #include <string> #inclu ...

  5. js阻止提交表单(post)

    在注册页面,我们经常要用到页面验证,验证到不符合要求的数据就阻止提交到服务器,如下 <script type="text/javascript"> function C ...

  6. 数据存储--沙盒sandBox

    默认情况下,每个沙盒必含有3个文件夹:Documents, Library 和 tmp 一.沙盒(sandbox)出于安全的目的,应用程序只能将自己的数据和偏好设置写入到几个特定的位置上.当应用程序被 ...

  7. XMLHttpRequest cannot load file:///E:/userdialog.html?_=1465888805734. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-reso

    做前端写静态页面时,采用的是jq easyui框架 在ie与webkit总是加载的时候总是在loading... 而firefox却是正常加载的,总以为是代码写错了, 经过再三的检查以及百度查找,确认 ...

  8. LeetCode(115) Distinct Subsequences

    题目 Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequen ...

  9. 读写SD

    public class SD_Files_RW extends Activity implements OnClickListener{ private String Text_of_input; ...

  10. css定位position认识

    1.绝对定位(position: absolute) 2.相对定位(position: relative) 3.固定定位(position: fixed) 绝对定位 设置position:absolu ...