Silverlight動態加載菜單和菜單動畫(改良版:增加下拉條)


  前幾天發過一篇Silverlight動態加載菜單和菜單動畫的文章,當時界面布局用的控件是Canvas,由於要對不同屏幕尺寸適應,所以需要更換布局元素,今天我就把我更改布局元素的代碼分享一下,也算是對今天工作的一個總結吧!

   

  代碼部分:

  Xaml代碼: 容器這里改用StackPanel,外面嵌套ScrollViewer,內容超出后可以下拉

 

以前的頁面:
<Canvas Margin= " 11,12,19,0 " Width= " 100 ">
  <Image Height= " 21 " x:Name= " Img_Story " Margin= " 0 " Source= " /UserCtrol.VMS;component/Images/sblb_roadbg.png " Stretch= " Fill " VerticalAlignment= " Top "/>
  <Canvas Name= " Canvas_KayoutRoot " Margin= " 25,0,0,0 ">
  </Canvas>
</Canvas>

 

更改后的代碼:
<ScrollViewer x:Name= " scrolls " VerticalScrollBarVisibility= " Auto " HorizontalScrollBarVisibility= " Auto ">
  <StackPanel x:Name= " Panel_Road " Margin= " 0,10 ">
  </StackPanel>
</ScrollViewer>

 

  Xam.cs 代碼:  T代表你定義的對象

 

以前的代碼:
///   <summary>
///  定義白色
///   </summary>
SolidColorBrush WhiteColorBrush =  new SolidColorBrush();

///   <summary>
///  定義灰色
///   </summary>
SolidColorBrush OtherColorBrush =  new SolidColorBrush();

// 設置顏色
WhiteColorBrush.Color = Color.FromArgb( 255255255255);
OtherColorBrush.Color = Color.FromArgb( 255616161);
///   <summary>
///  遍歷返回的數據加載到頁面中
///   </summary>
///   <param name="_List"> 菜單列表 </param>
private  void AddElementToPage(List<T> _List)
{
  Int32 elmentNum =  0;   // 當前列表的序列號
   foreach (T item  in _List)
  {
    TextBlock _TextBlock =  new TextBlock();
    _TextBlock.Text = item.Name;
    Canvas.SetTop(_TextBlock, elmentNum *  30);
     _TextBlock.FontSize =  14;
     if (elmentNum ==  0)
    {
      _TextBlock.Foreground = WhiteColorBrush;
    }
     else
    {
      _TextBlock.Foreground = OtherColorBrush;
    }
     // 點擊事件
    _TextBlock.MouseLeftButtonDown +=  new MouseButtonEventHandler(_TextBlock_MouseLeftButtonDown);
     // 將元素添加到容器中
    _NewDeviceItem.Canvas_KayoutRoot.Children.Add(_TextBlock);
    elmentNum++;
  }
}

///   <summary>
///  點擊事件
///   </summary>
///   <param name="sender"></param>
///   <param name="e"></param>
void _TextBlock_MouseLeftButtonDown( object sender, MouseButtonEventArgs e)
{
  TextBlock Txt_Road = sender  as TextBlock;
   // 檢索頁面元素,設置文字顏色
   foreach (FrameworkElement fe  in _NewDeviceItem.Canvas_KayoutRoot.Children)
  {
     if (fe  is TextBlock)     // 檢索TextBlock
    {
      TextBlock chk = (TextBlock)fe;
       if (chk.Equals(Txt_Road))
      {
        chk.Foreground = WhiteColorBrush;    // 當前點擊的設為白色
      }
       else
      {
        chk.Foreground = OtherColorBrush;    // 其他的改變回原來默認顏色
      }
    }
  }
   // 獲得元素當前x坐標
  Double Txt_Road_Left = Canvas.GetLeft(Txt_Road);
   // 獲得元素當前x坐標
  Double Txt_Road_Top = Canvas.GetTop(Txt_Road);
   // 創建點擊動畫
  CreateStoryBoard(Txt_Road_Left, Txt_Road_Top);
}

///   <summary>
///  創建點擊動畫
///   </summary>
///   <param name="Txt_Road_Left"> x軸位置 </param>
///   <param name="Txt_Road_Top"> y軸位置 </param>
private  void CreateStoryBoard(Double Txt_Road_Left, Double Txt_Road_Top)
{
  Storyboard storyboard =  new Storyboard();    // 實例化Storyboard
  
// 實例化X軸動畫對象
  DoubleAnimation doubleAnimationX =  new DoubleAnimation();
  doubleAnimationX.Duration =  new Duration(TimeSpan.FromMilliseconds( 500));    // 設置動畫延時時間
  doubleAnimationX.From = Txt_Road_Left -  10;      // 設置動畫初始值
  doubleAnimationX.To = Txt_Road_Left;     // 設置動畫完成值
  Storyboard.SetTarget(doubleAnimationX,  this.Img_Story);      // 設置動畫操作對象
  Storyboard.SetTargetProperty(doubleAnimationX,  new PropertyPath( " (Canvas.Left) "));       // 設置動畫操作對象的屬性
  storyboard.Children.Add(doubleAnimationX);       // 將動畫加載到Storyboard
  
// 實例化Y軸動畫對象
  DoubleAnimation doubleAnimationY =  new DoubleAnimation();
  doubleAnimationY.Duration =  new Duration(TimeSpan.FromMilliseconds( 0));      // 設置動畫延時時間
  doubleAnimationY.From = Txt_Road_Top;    // 設置動畫初始值
  doubleAnimationY.To = Txt_Road_Top;      // 設置動畫完成值
  Storyboard.SetTarget(doubleAnimationY,  this.Img_Story);      // 設置動畫操作對象
  Storyboard.SetTargetProperty(doubleAnimationY,  new PropertyPath( " (Canvas.Top) "));    // 設置動畫操作對象的屬性
  storyboard.Children.Add(doubleAnimationY);       // 將動畫加載到Storyboard
  
// 開始動畫
  storyboard.Begin();
}

 

更改后的代碼:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using Microsoft.Phone.Controls;
using System.Windows.Media.Imaging;

namespace PhoneTest1
{
     public  partial  class MaainPage : PhoneApplicationPage
    {
         ///   <summary>
        
///  記錄最后一次點擊
        
///   </summary>
        Canvas _LastCanvas =  new Canvas();

         ///   <summary>
        
///  動畫圖片
        
///   </summary>
        Image Img_Story =  new Image();

         ///   <summary>
        
///  定義白色
        
///   </summary>
        SolidColorBrush WhiteColorBrush =  new SolidColorBrush();

         ///   <summary>
        
///  定義灰色
        
///   </summary>
        SolidColorBrush OtherColorBrush =  new SolidColorBrush();

         public MainPage()
        {
            InitializeComponent();
             this.Loaded +=  new RoutedEventHandler(MainPage_Loaded);
        }

         void MainPage_Loaded( object sender, RoutedEventArgs e)
        {
             // 設置顏色
            WhiteColorBrush.Color = Color.FromArgb( 255255255255);
            OtherColorBrush.Color = Color.FromArgb( 255616161);
            Boolean _IsFirstAddElement =  false;
             for ( int i =  0; i <  10; i++)
            {
                Canvas _Canvas =  new Canvas();
                _Canvas.Height =  60;
                TextBlock _TextBlock =  new TextBlock();
                _TextBlock.Text = i.ToString() +  " :測試程序 "// 你自己重命名
                Canvas.SetLeft(_TextBlock,  30);  // 30是距canvas左邊,你自己可以調整
                Canvas.SetZIndex(_TextBlock,  100);  // 設置圖層,防止文本被遮蓋
                _TextBlock.FontSize =  30;
                _Canvas.Children.Add(_TextBlock);
                 if (!_IsFirstAddElement)
                {
                    _IsFirstAddElement =  true;
                     this.Img_Story.Source =  new BitmapImage( new Uri( " /PhoneTest1;component/Image/Test.PNG ", UriKind.RelativeOrAbsolute));
                    Canvas.SetLeft(Img_Story,  0);  // 30是距canvas左邊,你自己可以調整
                    Canvas.SetZIndex(Img_Story,  0);  // 設置圖層,防止文本被遮蓋
                    _Canvas.Children.Add( this.Img_Story);
                     this._LastCanvas = _Canvas;
                    _TextBlock.Foreground = WhiteColorBrush;
                }
                 else
                {
                    _TextBlock.Foreground = OtherColorBrush;
                }
                 // 點擊事件
                _TextBlock.MouseLeftButtonDown +=  new MouseButtonEventHandler(_TextBlock_MouseLeftButtonDown);
                 // 將元素添加到容器中
                 this.Panel_Element.Children.Add(_Canvas);
            }
        }

         ///   <summary>
        
///  點擊事件
        
///   </summary>
        
///   <param name="sender"></param>
        
///   <param name="e"></param>
         void _TextBlock_MouseLeftButtonDown( object sender, MouseButtonEventArgs e)
        {
            TextBlock Txt_Road = sender  as TextBlock;
             // 檢索頁面元素,設置文字顏色
             foreach (FrameworkElement fe  in  this.Panel_Element.Children)
            {
                 if (fe  is Canvas)     // 檢索TextBlock
                {
                    Canvas _Canvas = (Canvas)fe;
                    TextBlock chk = (TextBlock)_Canvas.Children[ 0];
                     if (chk.Equals(Txt_Road))
                    {
                        _LastCanvas.Children.Remove( this.Img_Story);
                        _Canvas.Children.Add( this.Img_Story);
                         this._LastCanvas = _Canvas;
                        chk.Foreground = WhiteColorBrush;    // 當前點擊的設為白色
                        CreateStoryBoard();
                    }
                     else
                    {
                        chk.Foreground = OtherColorBrush;    // 其他的改變回原來默認顏色
                    }
                }
            }
        }

         ///   <summary>
        
///  創建點擊動畫
        
///   </summary>
         private  void CreateStoryBoard()
        {
            Storyboard storyboard =  new Storyboard();    // 實例化Storyboard
            
// 實例化X軸動畫對象
            DoubleAnimation doubleAnimationX =  new DoubleAnimation();
            doubleAnimationX.Duration =  new Duration(TimeSpan.FromMilliseconds( 500));    // 設置動畫延時時間
            doubleAnimationX.From =  0;      // 設置動畫初始值
            doubleAnimationX.To =  10;     // 設置動畫完成值
            Storyboard.SetTarget(doubleAnimationX,  this.Img_Story);      // 設置動畫操作對象
            Storyboard.SetTargetProperty(doubleAnimationX,  new PropertyPath( " (Canvas.Left) "));       // 設置動畫操作對象的屬性
            storyboard.Children.Add(doubleAnimationX);       // 將動畫加載到Storyboard
            
// 開始動畫
            storyboard.Begin();
        }
    }
}

 

  后台邏輯實現是我回家后自己重新寫的,那些代碼在公司忘記帶回了,如果有問題大家可以留言,我一定盡快改正!

  涉及知識點:Stackpanel、Canvas布局、容器內動態添加元素、遍歷頁面中的元素、故事板的使用

 

作者:彭海松

出處:http://www.cnblogs.com/haisongvip/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM