Silverlight 不可见的tabitems不在Visual Tree中

项目中发现一个问题,有个界面的Loaded事件被多次触发。

经过测试发现,这个界面在一个tabitem中,每次切换到这个page时,都会触发Loaded事件。

写个demo测试下

<navigation:Page x:Class="SilverlightApp.Tab.Page1" 
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable="d"
           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           d:DesignWidth="640" d:DesignHeight="480"
           Title="Page1 Page" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
    <Grid x:Name="LayoutRoot">
        <sdk:TabControl Height="266" HorizontalAlignment="Left" Margin="80,84,0,0" Name="tabControl1" VerticalAlignment="Top" Width="402">
            <sdk:TabItem Header="tabItem1" Name="tabItem1" >
                <TextBlock x:Name="txtBlk1" Text="tab item 1" Loaded="txtBlk1_Loaded" Unloaded="txtBlk1_Unloaded" />
            </sdk:TabItem>
            <sdk:TabItem Header="tabItem2" Name="tabItem2">
            </sdk:TabItem>
        </sdk:TabControl>
    </Grid>
</navigation:Page>

Code Behind

public partial class Page1 : Page
    {
        public Page1()
        {
            InitializeComponent();
        }

        private void txtBlk1_Loaded(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("text block loaded");
        }

        private void txtBlk1_Unloaded(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine("text block unloaded");
        }
    }

切换两个tabpage就会发现,textblock在不可见是会触发Unloaded事件,可见是会触发Loaded事件。

更详细的demo可以参考 这篇 文章。 当textblock不可见时,它根本就不在visual tree中。

posted on 2012-10-22 09:57  YanYangjiang  阅读(263)  评论(0)    收藏  举报

导航