none
Динамические компоненты RRS feed

  • Вопрос

  • В обработчике по нажатию кнопки, создается новая кнопка( button buttonb2 = new button()...). Как найти эту динамически-созданную кнопку в другом обработчике и переименовать или удалить ее?

    • Перемещено Siddharth Chavan 1 октября 2010 г. 21:32 MSDN Forums Consolidation (От:Visual C#)
    17 апреля 2010 г. 23:12

Ответы

  • Пример : в обработчике первой кнопки создается другая кнопка и добавляется на стек, а в обработчике второй кнопки меняется надпись на только что созданной динамической кнопки

    XAML

    <Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
      <StackPanel Name="stack">
        <Button Name="btnFirst" Click="btnFirst_Click">First</Button>
        <Button Name="btnSecond" Click="btnSecond_Click">Second</Button>
      </StackPanel>
    </Window>
    

     

    Присоединенный C#

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace WpfApplication1
    {
      /// <summary>
      /// Interaction logic for MainWindow.xaml
      /// </summary>
      public partial class MainWindow : Window
      {
        public MainWindow()
        {
          InitializeComponent();
        }
    
        private void btnFirst_Click(object sender, RoutedEventArgs e)
        {
          Button thirdButton = new Button();
          thirdButton.Name = "ThirdButton";
          thirdButton.Content = "Third button";
          stack.Children.Add(thirdButton);
        }
    
        private void btnSecond_Click(object sender, RoutedEventArgs e)
        {
          foreach (UIElement elem in stack.Children)
          {
            if (elem is Button)
            {
              Button testButton = (Button)elem;
              if (testButton.Name == "ThirdButton")
              {
                testButton.Content = "This updated Button";
                MessageBox.Show("Third Button Updated");
                return;
              }
            }
          }
          MessageBox.Show("Сначала нажмите первую кнопку, чтоб создать динамически третий Button");
        }
      }
    }
    
    • Помечено в качестве ответа I.Vorontsov 20 апреля 2010 г. 6:59
    19 апреля 2010 г. 9:02
  • application.current.windows не имеет такого метода т.к. является объектом WindowCollection и наследуется напрямую от object, в котором разумеется тоже ничего такого нет. Так что сократить код вряд ли удастся. можно лишь сделать его более понятным, выделив метод.

    • Помечено в качестве ответа oBun-JIokoc 21 апреля 2010 г. 10:48
    • Снята пометка об ответе oBun-JIokoc 21 апреля 2010 г. 10:48
    • Помечено в качестве ответа oBun-JIokoc 21 апреля 2010 г. 10:49
    21 апреля 2010 г. 10:19

Все ответы

  •  void button_Click(object sender, RoutedEventArgs e) {

    Button buttonb2 = new Button();

    buttonb2.Content="Новая кнопка";

    This.Children.Add(buttonb2);

    }

    void button2_Click(object sender, RoutedEventArgs e) {

    This.Children.Remove(buttonb2);

    //В этом обработчике не существует buttonb2, а в первом обработчике - есть. Как найти кнопку по ее имени и затем с ней работать????Хелп!

    }

    17 апреля 2010 г. 23:19
  • Пример : в обработчике первой кнопки создается другая кнопка и добавляется на стек, а в обработчике второй кнопки меняется надпись на только что созданной динамической кнопки

    XAML

    <Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
      <StackPanel Name="stack">
        <Button Name="btnFirst" Click="btnFirst_Click">First</Button>
        <Button Name="btnSecond" Click="btnSecond_Click">Second</Button>
      </StackPanel>
    </Window>
    

     

    Присоединенный C#

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace WpfApplication1
    {
      /// <summary>
      /// Interaction logic for MainWindow.xaml
      /// </summary>
      public partial class MainWindow : Window
      {
        public MainWindow()
        {
          InitializeComponent();
        }
    
        private void btnFirst_Click(object sender, RoutedEventArgs e)
        {
          Button thirdButton = new Button();
          thirdButton.Name = "ThirdButton";
          thirdButton.Content = "Third button";
          stack.Children.Add(thirdButton);
        }
    
        private void btnSecond_Click(object sender, RoutedEventArgs e)
        {
          foreach (UIElement elem in stack.Children)
          {
            if (elem is Button)
            {
              Button testButton = (Button)elem;
              if (testButton.Name == "ThirdButton")
              {
                testButton.Content = "This updated Button";
                MessageBox.Show("Third Button Updated");
                return;
              }
            }
          }
          MessageBox.Show("Сначала нажмите первую кнопку, чтоб создать динамически третий Button");
        }
      }
    }
    
    • Помечено в качестве ответа I.Vorontsov 20 апреля 2010 г. 6:59
    19 апреля 2010 г. 9:02
  • Спасибо большое, так бы я долго додумывался, что foreach тут поможет. у меня еще один вопрос: если можно найти контрол по имени, который является дочерним по другому контролу, то как найти window ?

     

    Window shkod = new Window();

    shkod.Name=

    "shkod";

     

    Button but5 = new Button();

    but5.Content=

    "ok";

    but5.Click +=

    new RoutedEventHandler(but5_Click);

    stack2.Children.Add(but5);

     

    void but5_Click(object sender, RoutedEventArgs e)

    {

    foreach

     

    (UIElement win in ...)

    // что писать вместо троеточие? или для window необходимы другие методы?

    {

    if (win is Window)

    {

    Window testwin = (Window)win;

    if

     

    (testwin.Name="shkod")

    {

    testwin.Close();

     

    return;

    }

    }

    }

    }

    19 апреля 2010 г. 21:15
  • Коллекцию окон можно получить

    Application.Current.Windows

    Поправочка по предыдущему ответу. Можно не перечислять дочерние элементы, а воспользоваться функций FindName, что проще

    Button b = stack.FindName("ThirdButton") as Button;
    
    20 апреля 2010 г. 7:29
  • Опять же, Window win= ...  FindName("shkod") as Window;

    win.close();  не катит, вместо троеточие непонятно, какой родитель.  application.current.windows не имеет такой функции. С динамическими окнами только через перечисление работать? хотелось бы сократить код.

    21 апреля 2010 г. 9:37
  • application.current.windows не имеет такого метода т.к. является объектом WindowCollection и наследуется напрямую от object, в котором разумеется тоже ничего такого нет. Так что сократить код вряд ли удастся. можно лишь сделать его более понятным, выделив метод.

    • Помечено в качестве ответа oBun-JIokoc 21 апреля 2010 г. 10:48
    • Снята пометка об ответе oBun-JIokoc 21 апреля 2010 г. 10:48
    • Помечено в качестве ответа oBun-JIokoc 21 апреля 2010 г. 10:49
    21 апреля 2010 г. 10:19