WPF, как я создаю текстовое поле динамично и нахожу текстовое поле на нажатии кнопки?

Если вы назначите вашу цитату в поле textContent вашего абзаца p, она будет отображаться в виде простого текста. Если вместо этого вы используете innerHTML, он будет анализировать и отображать любой предоставленный вами HTML.

См. Пример.

const p = document.getElementById("sentences");
const origSentences = [
  "This is the <br /> first sentence.",
  "This is the second sentence.",
  "This is the <br /> third sentence."
];
let remainingSentences = [];

function randomSentence() {
  if (remainingSentences.length === 0)
    remainingSentences = origSentences.slice();
  const { length } = remainingSentences;
  const [quote] = remainingSentences.splice(
    Math.floor(Math.random() * length),
    1
  );
  p.innerHTML = quote;
}
<p>
  <button 
    onclick="randomSentence()" 
    type="button">
    Random Sentence
  </button>
</p>

<p id="sentences"></p>

17
задан Dave Clemmer 25 August 2011 в 15:37
поделиться

5 ответов

У Josh G была подсказка, которая исправила этот код: используйте RegisterName ().

Три преимущества здесь:

  1. не использует членскую переменную для сохранения ссылки на динамично созданный TextBox.
  2. Компиляции.
  3. Полный код.

    using System;
    using System.Windows;
    using System.Windows.Controls;
    
    namespace AddControlsDynamically
    {
        public partial class Window1 : Window
        {
            public void Window_Loaded(object sender, RoutedEventArgs e)
            {
                GenerateControls();
            }
            public void GenerateControls()
            {
                Button btnClickMe = new Button();
                btnClickMe.Content = "Click Me";
                btnClickMe.Name = "btnClickMe";
                btnClickMe.Click += new RoutedEventHandler(this.CallMeClick);
                someStackPanel.Children.Add(btnClickMe);
                TextBox txtNumber = new TextBox();
                txtNumber.Name = "txtNumber";
                txtNumber.Text = "1776";
                someStackPanel.Children.Add(txtNumber);
                someStackPanel.RegisterName(txtNumber.Name, txtNumber);
            }
            protected void CallMeClick(object sender, RoutedEventArgs e)
            {
                TextBox txtNumber = (TextBox) this.someStackPanel.FindName("txtNumber");
                string message = string.Format("The number is {0}", txtNumber.Text);
                MessageBox.Show(message);
            }
        }
    }
    
17
ответ дан 30 November 2019 в 12:01
поделиться

Другой метод должен установить связанное TextBox как Button Tag когда instanciating их.

btnClickMe.Tag = txtNumber;

Этот путь можно получить его назад в обработчике событий.

protected void ClickMeClick(object sender, RoutedEventArgs e)
{
    Button btnClickMe = sender as Button;
    if (btnClickMe != null)
    {
        TextBox txtNumber = btnClickMe.Tag as TextBox;
        // ...
    }
}
6
ответ дан 30 November 2019 в 12:01
поделиться

Можно заставить исходный обработчик щелчков работать путем регистрации названия текстового поля:

someStackPanel.RegisterName(txtNumber.Name, txtNumber);

Это затем позволит Вам называть FindName на StackPanel и находить TextBox.

5
ответ дан 30 November 2019 в 12:01
поделиться

Если Вы хотите сделать всесторонний поиск через визуальное дерево средств управления, можно использовать класс VisualTreeHelper.

Используют следующий код для итерации через всех визуальных детей управления:

for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parentObj); i++)
{
    DependencyObject child = VisualTreeHelper.GetChild(parent, i);

    if (child is TextBox)
        // Do something
}

, Если Вы хотите искать вниз в дерево, Вы захотите выполнить этот цикл рекурсивно, как так:

public delegate void TextBoxOperation(TextBox box);

public bool SearchChildren(DependencyObject parent, TextBoxOperation op)
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(parent, i);

        TextBox box = child as TextBox;

        if (box != null)
        {
            op.Invoke(box);
            return true;
        }

        bool found = SearchChildren(child, op);

        if (found)
            return true;
    }
}
4
ответ дан 30 November 2019 в 12:01
поделиться

Есть ли любой способ, которым можно заставить TextBox управлять полем в классе вместо переменной в методе генератора

public class MyWindow : Window
{
    private TextBox txtNumber;

    public void Window_Loaded()
    {
        GenerateControls();
    }

    public void GenerateControls()
    {
        Button btnClickMe = new Button();
        btnClickMe.Content = "Click Me";
        btnClickMe.Name = "btnClickMe";
        btnClickMe.Click += new RoutedEventHandler(this.CallMeClick);
        someStackPanel.Childern.Add(btnClickMe);
        txtNumber = new TextBox();
        txtNumber.Name = "txtNumber";
        txtNumber.Text = "1776";
        someStackPanel.Childern.Add(txtNumber);
    }

    protected void ClickMeClick(object sender, RoutedEventArgs e)
    {    
        // Find the phone number    
        string message = string.Format("The number is {0}", txtNumber.Text);        
        MessageBox.Show(message);
    }
}
3
ответ дан 30 November 2019 в 12:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: