zoukankan      html  css  js  c++  java
  • 3.如何获取动态生成的SL控件的NAME值(一)

    解决问题:
    1.如何给动态生成的SL控件添加事件;
    2.如何获取页面的控件的值;
      第一种是单纯的在页面写的XAML文件里的控件的NAME值;这种控件用FindName即可
      第二种是动态生成的SL控件的NAME值;动态生成的用Children即可;
    3. 注意:动态创建控件的时候,控件的事件代码button1.Click += new RoutedEventHandler(button1_Click);应写在 parentCanvas.Children.Add(button1);之前

    思路:先是动态创建一个按钮与一条线,在创建按钮的时候给按钮添加事件,当我点击这个动态创建的按钮的时候,
    获取页面的所有的控件的 name 值。

    点击”动态创建XAML对象“按钮前:

    点击”动态创建XAML对象“按钮后:

     

    .MainPage.xaml
     1 <UserControl x:Class="sl19.MainPage"
     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;
    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[0as Button;
                
    if (btncil != null)
                {
                    MessageBox.Show(
    "我获取了动态生成按钮的NAME值" + btncil.GetValue(NameProperty).ToString());
                }

                Button btncixaml 
    = parentCanvas.Children[1as Button;
                
    if (btncixaml != null)
                {
                  
    //  name = btncixaml.Content.ToString();
                    MessageBox.Show("我获取了页面添加的按钮的值" + btncixaml.Content.ToString());
                }

                Line line 
    = parentCanvas.Children[2as 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

  • 相关阅读:
    LINUX开发使用的3个远程工具
    NDK 链接第三方静态库的方法
    GMap.NET 显示GIF图标的定制
    从MySQL获取数据
    web2py远程开发
    升级后,使用dynamic报错
    实用的MVVM:ImageView
    node.js 连接 mysql
    vector常见用法
    XCODE中配置使用boost
  • 原文地址:https://www.cnblogs.com/muer/p/1740250.html
Copyright © 2011-2022 走看看