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