zoukankan      html  css  js  c++  java
  • WPF Loaded事件连续调用两次的问题

          最近开发的一套系统中,在检查开发成员的代码时候,在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事件走两次。不理解原因所在,请高手指点。

  • 相关阅读:
    【Java123】HTTP Post Form Data 传输的Java实现
    【数据库123】Oracle数据库数据实时监控
    【Java123】Java基础知识点
    【测试123】ISTQB AL
    【Git123】Git 常用命令
    [Java123] Spring
    【Java123】JavaWeb Servlet开发
    [Java123] JBoss
    [SQL123] Oracle SQL 统计一定时间间隔内的数据
    【测试123】性能测试之压力测试
  • 原文地址:https://www.cnblogs.com/xxyxxb2080/p/3783936.html
Copyright © 2011-2022 走看看