Как я могу программно получить доступ к определенному запуску после добавления его в Windows.UI.Xaml.Controls.Текстовый блок?

#c# #xaml #uwp

#c# #xaml #uwp

Вопрос:

Я хочу иметь возможность программного доступа к определенному запуску после добавления его в Windows.UI.Xaml.Controls.TextBlock но я не могу задать имя запуска, потому что свойство Name доступно только для чтения (позволяет получить, но не установить).

Каждый запуск будет создаваться динамически с помощью цикла (не во время разработки (xaml)), и я не буду знать индекс (i-й), поскольку они могут быть созданы в любом порядке. Я бы знал слово или ключевое слово, которое будет в прогоне, но в противном случае у меня нет другого способа отличить один отдельный прогон от другого.

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

 using Windows.UI.Xaml.Controls;

var myTextBlock = new TextBlock(); 

var someRun = new Run
{   
     Text = "Some run to start"
};

myTextBlock.Inlines.Add(someRun)

var aRandomRun = new Run
{   
     Text = "A random run with some words"
};

myTextBlock.Inlines.Add(aRandomRun)

var anotherRun = new Run
{   
     Text = "Another run, could be anything"
};

myTextBlock.Inlines.Add(anotherRun)

private void GetTextButton_Click(object sender, RoutedEventArgs e)
{
    // Get the text of any of these above runs in myTextBlock

    // I tried "FindName" but since I cannot set the the name of the Run, I cannot use FindName to find the Run
    var anotherRunText = myTextBlock.Inlines.Where(x=> x.FindName
}
  

Комментарии:

1. Не могли бы вы быть более конкретными? Потому что, если вы знаете, какой запуск вы хотите получить, вы можете просто определить этот запуск как переменную в файле .cs. В противном случае вы могли бы взять i-й элемент из myTextBlock.Inlines . Вы также можете определить этот текстовый блок или запуски в ресурсах xaml файла, с которым вы работаете, или в app.xaml ресурсах. Определение Run ‘s там позволяет задать имя для запусков.

2. @Leander. Спасибо. Каждый запуск будет создаваться динамически с помощью цикла (не во время разработки (xaml)), и я не буду знать индекс (i-й), поскольку они могут быть созданы в любом порядке. Я бы знал слово или ключевое слово, которое будет в прогоне, но в противном случае у меня нет другого способа отличить один отдельный прогон от другого. Я обновил свой вопрос с помощью этой информации.

3. Спасибо за ответ, я предоставил ответ на основе этой информации, пожалуйста, ответьте, если это не то, что вы ищете.

4. Спасибо, оба подхода в вашем ответе хороши, но FindInlineText достаточен для моих нужд. Еще раз спасибо!

Ответ №1:

Если ваш единственный способ отличить Run ‘ы друг от друга — это их текст. Вы действительно могли бы использовать то, что вы уже пробовали, однако вместо использования Name свойства вы используете свойство text:

 string FindInlineText(string keyword)
{
    string anotherRunText = ((Run)myTextBlock.Inlines.First(i => ((Run)i).Text.Contains(keyword))).Text;
    return anotherRunText;
}
  

Кажется невозможным подойти к этому по-другому, поскольку Run.Name это получается только в коде, и хотя Tag свойство должно быть унаследовано от FrameworkContentElement класса, его невозможно установить.

Если вам нужно использовать другой идентификатор, чтобы отличать текстовые элементы друг от друга, вы можете вместо этого использовать горизонтальный StackPanel и множественный TextBlock :

 StackPanel stack = new StackPanel { Orientation = Windows.UI.Xaml.Controls.Orientation.Horizontal };
for (int i = 0; i < 10; i  )
{ 
    stack.Children.Add(new TextBlock 
    { 
        Name = $"inlineblock_{i}", 
        Text = i.ToString() 
    }); 
}
  

И теперь вы, конечно, можете получить правильный текст TextBlock , используя:

 string certainText = ((TextBlock)stack.Children.First(i => ((TextBlock)i).Name == certainName)).Text;