如何取动态创建和修改PivotItem的子控件

来源:互联网 发布:网络自制剧营销 编辑:程序博客网 时间:2024/06/11 14:03

        很多时候,我们使用MVVM模式创建的PivotItem的时候,主要是设置了Header,可能各个PivotItem的大体布局相同,但是局部却有差异,比如:

 


        那么,如何得到 CanvasDetailBottum(就是底部不同的两个文字显示区域) 并且往这个Canvas里面添加UIElement呢?


这是载入数据的代码:

private void SetPivotItem()
        {
            mFundDetailPageData.Clear();
            pivotFundDetailPage.SelectedIndex = -1;

            switch (mFundDetail.mFundType)
            {
                case FundDetail.EFundDetailsType.EStockFund_in:
                    mFundDetailPageData.Add(new PivotItemViewModelFund("盘间数据", 0));
                    mFundDetailPageData.Add(new PivotItemViewModelFund("基金资料", 1));
                    break;
                case FundDetail.EFundDetailsType.EStockFund_out:
                    mFundDetailPageData.Add(new PivotItemViewModelFund("基金资料", 0));
                    break;
                case FundDetail.EFundDetailsType.EStockFund_money:
                    break;
            }

            pivotFundDetailPage.ItemsSource = mFundDetailPageData;
        }


当LoadedPivotItem事件发生时,通过遍历PivotItem,即可取得各个内层控件:


        private void pivotFundDetailPage_LoadedPivotItem(object sender, PivotItemEventArgs e)
        {

                    PivotItem pI = e.Item;               

                    PivotItemViewModelFund fund = mFundDetailPageData[pivotFundDetailPage.SelectedIndex];
                    if (fund.FindAllChild(pI))  //在这里找到所有的内层控件
                    {

                    }
        }

在 PivotItemViewModelFund 类定义了如何根据控件名称(控件名称,如"CanvasDetailBottum",见本文最后xaml里面的定义)得到控件:

        public TextBlock StockPrice = null;
        public TextBlock StockDiff = null;
        public TextBlock StockChg = null;
        public TextBlock StockDate = null;
        public TextBlock StockTime = null;
        public Image StockImageMiddle = null;
        public Grid PivotItemContentDetail = null;
        public Canvas CanvasImageMiddle = null;
        public Canvas CanvasDetailBottum = null;

        public bool mPivotItemLoaded = false; //控件载入设置完毕
        internal bool FindAllChild(DependencyObject root)
        {
            if (mPivotItemLoaded) { return true; }

            int cnt = 0;
            const int cntTotal = 9;
            var queue = new Queue<DependencyObject>();
            queue.Enqueue(root);            
            while (queue.Count > 0)
            {
                DependencyObject current = queue.Dequeue();
                for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--)
                {
                    var child = VisualTreeHelper.GetChild(current, i);
                    Type myType = child.GetType();
                    FieldInfo[] myFieldInfo = myType.GetFields();
                    switch (myType.Name)
                    {
                        case "Grid":
                            {
                                Grid var = child as Grid;
                                if (var != null && var.Name == "PivotItemContentDetail")
                                {
                                    PivotItemContentDetail = var;
                                    cnt++;
                                    if (mPivotItemLoaded = cnt >= cntTotal) { return true; }
                                }
                            }
                            break;
                        case "TextBlock":
                            {
                                TextBlock var = child as TextBlock;
                                if (var != null)
                                {
                                    switch (var.Name)
                                    {
                                        case "StockPrice":
                                            StockPrice = var;
                                            cnt++;
                                            if (mPivotItemLoaded = cnt >= cntTotal) { return true; }
                                            break;
                                        case "StockChg":
                                            StockChg = var;
                                            cnt++;
                                            if (mPivotItemLoaded = cnt >= cntTotal) { return true; }
                                            break;
                                        case "StockDate":
                                            StockDate = var;
                                            cnt++;
                                            if (mPivotItemLoaded = cnt >= cntTotal) { return true; }
                                            break;
                                        case "StockTime":
                                            StockTime = var;
                                            cnt++;
                                            if (mPivotItemLoaded = cnt >= cntTotal) { return true; }
                                            break;
                                        case "StockDiff":
                                            StockDiff = var;
                                            cnt++;
                                            if (mPivotItemLoaded = cnt >= cntTotal) { return true; }
                                            break;
                                    }
                                }
                            }
                            break;
                        case "Image":
                            {
                                Image var = child as Image;
                                if (var != null && var.Name == "StockImageMiddle")
                                {
                                    StockImageMiddle = var;
                                    cnt++;
                                    if (mPivotItemLoaded = cnt >= cntTotal) { return true; }
                                }
                            }
                            break;
                        case "Canvas":
                            {
                                Canvas var = child as Canvas;
                                if (var != null)
                                {
                                    switch (var.Name)
                                    {
                                        case "CanvasImageMiddle":
                                            CanvasImageMiddle = var;
                                            cnt++;
                                            if (mPivotItemLoaded = cnt >= cntTotal) { return true; }
                                            break;
                                        case "CanvasDetailBottum":
                                            CanvasDetailBottum = var;
                                            cnt++;
                                            if (mPivotItemLoaded = cnt >= cntTotal) { return true; }
                                            break;

                                    }
                                }
                            }
                            break;
                    }
                    queue.Enqueue(child);
                }
            }
            return false;
        }


当LoadedPivotItem事件发生后,已经取得了当前PivotItem的各个内层控件,这个时候就可以对这些控件进行任意的操作,比如调整高度,设置ImageSource,在Canvas中添加任意内层控件,这样就可以得到任意自己想要的效果了。

需要注意的是,通过thisPage的指针是无法通过控件名称得到通过Templete添加的控件的。


至此,自定义PivotItem就变得轻松且简单了:


                PivotItemViewModelFund fund = mFundDetailPageData[pivotIndex];  //pivotIndex = SelectedIndex

                if (fund.mPivotItemLoaded)
                {
                    Color clr = Color.FromArgb(255, 14, 31, 53);
                    fund.CanvasDetailBottum.Children.Clear();
                    double _top = 0.0;
                    switch (pivotIndex)
                    {
                        case 0: //盘间数据
                            if (mFundDetail.mFundType == FundDetail.EFundDetailsType.EStockFund_out)
                            {
                                goto case 1;
                            }
                            else if (mFundDetail.mFundType == FundDetail.EFundDetailsType.EStockFund_in)
                            {
                                fund.CanvasDetailBottum.Children.Add(fund.CreateCanvas("开盘价:", mFundDetail.open, "昨收盘:", mFundDetail.last_close, _top, mCanvasDetailLineHeight, clr));
                                _top += mCanvasDetailLineHeight;
                                fund.CanvasDetailBottum.Children.Add(fund.CreateCanvas("最低价:", mFundDetail.low, "最高价:", mFundDetail.high, _top, mCanvasDetailLineHeight, Colors.Transparent));
                                _top += mCanvasDetailLineHeight;
                                fund.CanvasDetailBottum.Children.Add(fund.CreateCanvas("折价率:", mFundDetail.discount_rate, "成交量:", mFundDetail.Amount, _top, mCanvasDetailLineHeight, clr));
                                _top += mCanvasDetailLineHeight;
                                fund.CanvasDetailBottum.Children.Add(fund.CreateCanvas("基金净值:", mFundDetail.per_nav, "累计净值:", mFundDetail.total_nav, _top, mCanvasDetailLineHeight, Colors.Transparent));
                                _top += mCanvasDetailLineHeight;
                                fund.CanvasDetailBottum.Children.Add(fund.CreateCanvas("增长率:", mFundDetail.nav_rate + "%", "净值日期:", mFundDetail.nav_date, _top, mCanvasDetailLineHeight, clr));
                            }
                            break;
                        case 1:  //基金资料                         
                            fund.CanvasDetailBottum.Children.Add(fund.CreateCanvas("申购:", mFundDetail.sg_stat, "赎回:", mFundDetail.sh_stat, _top, mCanvasDetailLineHeight, clr));
                            _top += mCanvasDetailLineHeight;
                            fund.CanvasDetailBottum.Children.Add(fund.CreateCanvas("基金经理:", mFundDetail.fund_manager, _top, mCanvasDetailLineHeight, Colors.Transparent));
                            _top += mCanvasDetailLineHeight;
                            fund.CanvasDetailBottum.Children.Add(fund.CreateCanvas("管理人:", mFundDetail.fund_company, _top, mCanvasDetailLineHeight, clr));
                            _top += mCanvasDetailLineHeight;
                            fund.CanvasDetailBottum.Children.Add(fund.CreateCanvas("基金类型:", mFundDetail.jjlx, _top, mCanvasDetailLineHeight, Colors.Transparent));
                            _top += mCanvasDetailLineHeight;
                            fund.CanvasDetailBottum.Children.Add(fund.CreateCanvas("基金规模:", mFundDetail.Jjzfe, _top, mCanvasDetailLineHeight, clr));
                            break;
                    }
                }


下面摘取了thisPage.xaml的部分内容:


    <Grid x:Name="LayoutRoot" Background="#FF000D22">        <controls:Pivot Height="696" Name="pivotFundDetailPage" LoadedPivotItem="pivotFundDetailPage_LoadedPivotItem">            <controls:Pivot.Title>                <Grid>                    <Grid.ColumnDefinitions>                        <ColumnDefinition Width="Auto"></ColumnDefinition>                        <ColumnDefinition></ColumnDefinition>                    </Grid.ColumnDefinitions>                    <TextBlock x:Name="PageTitle" Text="基金名称" Margin="0,0,0,0" Style="{StaticResource PhoneTextTitle1Style}" Height="96" TextAlignment="Left" Grid.Column="0" />                    <TextBlock HorizontalAlignment="Left" Margin="5,66,0,0" Name="textBlockStockSymbol" Text="基金代码" VerticalAlignment="Top" FontSize="20" TextAlignment="Left" Grid.Column="1" />                </Grid>            </controls:Pivot.Title>            <controls:Pivot.HeaderTemplate>                <DataTemplate>                    <TextBlock Text="{Binding Path=PivotItemHeaderText}" FontSize="{StaticResource PhoneFontSizeExtraLarge}" Height="60"></TextBlock>                                    </DataTemplate>            </controls:Pivot.HeaderTemplate>            <controls:Pivot.ItemTemplate>                <DataTemplate>                    <Grid x:Name="PivotItemContentDetail" Width="490" Margin="-10,0,0,0" VerticalAlignment="Top" HorizontalAlignment="Left">                        <Grid.RowDefinitions>                            <RowDefinition Height="80"></RowDefinition>                            <RowDefinition Height="220"></RowDefinition>                            <RowDefinition Height="200"></RowDefinition>                        </Grid.RowDefinitions>                        <Grid Grid.Row="0" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" Width="480" Background="#FF142A47">                            <Grid.ColumnDefinitions>                                <ColumnDefinition></ColumnDefinition>                                <ColumnDefinition></ColumnDefinition>                            </Grid.ColumnDefinitions>                            <TextBlock Name="StockPrice" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="42" Text="价格" Foreground="Red"></TextBlock>                            <Grid Grid.Column="1">                                <Grid>                                    <Grid.ColumnDefinitions>                                        <ColumnDefinition></ColumnDefinition>                                        <ColumnDefinition></ColumnDefinition>                                    </Grid.ColumnDefinitions>                                    <Grid.RowDefinitions>                                        <RowDefinition></RowDefinition>                                        <RowDefinition></RowDefinition>                                    </Grid.RowDefinitions>                                    <TextBlock Name="StockDiff" Grid.Column="0" Grid.Row="0" FontSize="20" TextAlignment="Left" Text="涨跌额" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="Red" Visibility="Collapsed"></TextBlock>                                    <TextBlock Name="StockChg" Grid.Column="0" Grid.Row="1" FontSize="20" TextAlignment="Left" Text="涨跌幅" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="Red"></TextBlock>                                    <TextBlock Name="StockTime" Grid.Column="1" Grid.Row="0" FontSize="20" TextAlignment="Left" Text="时间" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="#FF3E4F62" Visibility="Collapsed"></TextBlock>                                    <TextBlock  Name="StockDate" Grid.Column="1" Grid.Row="1" FontSize="20" TextAlignment="Left" Text="日期" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="#FF3E4F62"></TextBlock>                                </Grid>                            </Grid>                        </Grid>                        <Canvas Grid.Row="1" Name="CanvasImageMiddle" Margin="0,0,0,0" Width="490">                            <Image Name="StockImageMiddle" Stretch="None" VerticalAlignment="Center" HorizontalAlignment="Center"/>                        </Canvas>                        <Canvas Grid.Row="2" Margin="0,0,0,0" Name="CanvasDetailBottum" VerticalAlignment="Top" HorizontalAlignment="Left" Width="490"></Canvas>                    </Grid>                </DataTemplate>            </controls:Pivot.ItemTemplate>        </controls:Pivot>    </Grid>