解决问题:
1.如何给动态生成的SL控件添加事件;
2.如何获取页面的控件的值;
第一种是单纯的在页面写的XAML文件里的控件的NAME值;这种控件用FindName即可
第二种是动态生成的SL控件的NAME值;动态生成的用Children即可;
3. 注意:动态创建控件的时候,控件的事件代码button1.Click += new RoutedEventHandler(button1_Click);应写在 parentCanvas.Children.Add(button1);之前
思路:先是动态创建一个按钮与一条线,在创建按钮的时候给按钮添加事件,当我点击这个动态创建的按钮的时候,
获取页面的所有的控件的 name 值。
点击”动态创建XAML对象“按钮前:
点击”动态创建XAML对象“按钮后:


2 xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
3 xmlns:x = " http://schemas.microsoft.com/winfx/2006/xaml "
4 xmlns:d = " http://schemas.microsoft.com/expression/blend/2008 "
5 xmlns:mc = " http://schemas.openxmlformats.org/markup-compatibility/2006 "
6 mc:Ignorable = " d "
7 d:DesignHeight = " 300 " d:DesignWidth = " 400 " >
8 < Canvas x:Name = " parentCanvas " Background = " Maroon " >
9 < Button x:Name = " mmm " Margin = " 10 " Background = " Blue " Canvas.ZIndex = " 1 " Canvas.Top = " 150 " Canvas.Left = " 150 " Height = " 30 " Width = " 149 " Content = " 我是从页面文件添加的 " ></ Button >
10
11 </ Canvas >
12 </ UserControl >
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Text;
using System.Windows.Markup;
namespace sl19
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
/// /textBlock里面的文本
StringBuilder xaml = new StringBuilder();
xaml.Append( " <Button " );
xaml.Append( " xmlns=\ " http: // schemas.microsoft.com/client/2007\" ");
xaml.Append( " Canvas.Left=\ " 50 \ " Canvas.Top=\ " 30 \ " FontSize=\ " 20 \ " " );
xaml.Append( " FontWeight=\ " Bold\ " Content=\ " 动态创建XAML对象\ " /> " );
// 创建textBlock
Button button1 = (Button)XamlReader.Load(xaml.ToString());
// button1.Name = "button1";
button1.Click += new RoutedEventHandler(button1_Click);
parentCanvas.Children.Add(button1);
// line的xaml文本
xaml = new StringBuilder();
xaml.Append( " <Line Stroke=\ " Red\ " " );
xaml.Append( " xmlns=\ " http: // schemas.microsoft.com/client/2007\" ");
xaml.Append( " X1=\ " 30 \ " Y1=\ " 30 \ " " );
xaml.Append( " X2=\ " 200 \ " Y2=\ " 200 \ " StrokeThickness=\ " 3 \ " /> " );
// 创建LINE对象
Line line = (Line)XamlReader.Load(xaml.ToString());
line.Name = " line1 " ;
parentCanvas.Children.Add(line);
}
// Click后要执行的方法,已绑定
void button1_Click( object sender, RoutedEventArgs e)
{
Button btn = sender as Button;
StringBuilder str = new StringBuilder();
foreach (UIElement tmp_ui in this .parentCanvas.Children)
{
btn.Content += " - " + tmp_ui.GetValue(NameProperty).ToString(); // tmp_ui.GetValue(ContentProperty).ToString();
btn.Content += " - " ;
}
Button btncil = parentCanvas.Children[ 0 ] as Button;
if (btncil != null )
{
MessageBox.Show( " 我获取了动态生成按钮的NAME值 " + btncil.GetValue(NameProperty).ToString());
}
Button btncixaml = parentCanvas.Children[ 1 ] as Button;
if (btncixaml != null )
{
// name = btncixaml.Content.ToString();
MessageBox.Show( " 我获取了页面添加的按钮的值 " + btncixaml.Content.ToString());
}
Line line = parentCanvas.Children[ 2 ] as Line;
if (line != null )
{
line.StrokeThickness = 10 ;
line.X2 = 400 ;
line.Y2 = 400 ;
line.Stroke = new SolidColorBrush(Colors.Blue);
MessageBox.Show( " 我获取了线的值 " );
}
Button btn1 = parentCanvas.FindName( " mmm " ) as Button;
if (btn1 != null )
{
MessageBox.Show( " 你好,我获取了MMM的值 " + btn1.Content.ToString());
}
}
}
}
什么是Children?
oneOrMoreUIElements 一个或多个对象元素,派生自 UIElement。
这些元素可以是以下一个或多个元素:Border (Silverlight 2)、Canvas、Ellipse、Glyphs、Grid (Silverlight 2)、
Image、InkPresenter、Line、MediaElement、PasswordBox (Silverlight 2)、Path、Polygon、Polyline、Popup (Silverlight 2)、
Rectangle、Shape、StackPanel (Silverlight 2)、TextBlock、TextBox、(Silverlight 2)。
这个案例里用到的方法有
1.Canvas.Children.Add(创建的控件名称),动态创建个对象,并且把对象添加到SL插件上;
2.Canvas.Children[2] 获取面板上一个控件,最后生成的,意思是:不管是在XAML里面写的控件,还是在.CS文件里动态加进去的控件
Canvas.Children里面的控件是最后生成的控件的集合,类似HTML最后生成的页面一个意思;
3.MessageBox.Show();可以作为调试的时候使用很方便的;
4.btncil.GetValue(ContentProperty).ToString()这样写是错的。获取不到值
5.如何改变线的颜色 line.Stroke=new SolidColorBrush(Colors.Blue);
总结:主要是1.Canvas.Children这个方法的使用,希望下次自己不会在出现类似错误。
参照:
http://topic.csdn.net/u/20091119/15/c5cad6b2-bbf1-4cf3-93ee-70f46091f6b1.html
http://blog.csdn.net/beniao277/archive/2010/04/23/5519269.aspx