前幾天發過一篇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>
<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>
<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( 255, 255, 255, 255);
OtherColorBrush.Color = Color.FromArgb( 255, 61, 61, 61);
/// <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();
}
/// 定義白色
/// </summary>
SolidColorBrush WhiteColorBrush = new SolidColorBrush();
/// <summary>
/// 定義灰色
/// </summary>
SolidColorBrush OtherColorBrush = new SolidColorBrush();
// 設置顏色
WhiteColorBrush.Color = Color.FromArgb( 255, 255, 255, 255);
OtherColorBrush.Color = Color.FromArgb( 255, 61, 61, 61);
/// <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( 255, 255, 255, 255);
OtherColorBrush.Color = Color.FromArgb( 255, 61, 61, 61);
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();
}
}
}
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( 255, 255, 255, 255);
OtherColorBrush.Color = Color.FromArgb( 255, 61, 61, 61);
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/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。