Если вы назначите вашу цитату в поле 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>
У Josh G была подсказка, которая исправила этот код: используйте RegisterName ().
Три преимущества здесь:
Полный код.
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);
}
}
}
Другой метод должен установить связанное 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;
// ...
}
}
Можно заставить исходный обработчик щелчков работать путем регистрации названия текстового поля:
someStackPanel.RegisterName(txtNumber.Name, txtNumber);
Это затем позволит Вам называть FindName на StackPanel и находить TextBox.
Если Вы хотите сделать всесторонний поиск через визуальное дерево средств управления, можно использовать класс 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;
}
}
Есть ли любой способ, которым можно заставить 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);
}
}