У меня есть TextBlock, привязанный к свойству. Тем не менее, я хотел бы выделить некоторые слова в тексте. Каков самый простой способ сделать это? FYI, я новичок в WPF.Как сделать выделенные части связанного TextBlock?
4
A
ответ
6
Смелые отдельные слова включают в себя фактически создание более встроенных элементов, поэтому вы не можете просто привязать строку к тексту TextBlock и сделать это.
Что я сделал для этого в прошлом, создается подкласс TextBlock, у которого есть настраиваемое свойство, к которому я привязываюсь. Когда это свойство привязано, я очищаю Inlines базового TextBlock, а затем использую алгоритм, который анализирует новое строковое значение, создавая либо простые Runs, Bolds, Hyperlinks и т. Д.
Вот пример кода, который я написал для моего экспериментального клиента Twitter который обнаруживает URL-адреса, электронную почту и шаблон @ и создает для них гиперссылки. Регулярный текст встроен в обычный режим:
[ContentProperty("StatusText")]
public sealed class StatusTextBlock : TextBlock
{
#region Fields
public static readonly DependencyProperty StatusTextProperty = DependencyProperty.Register(
"StatusText",
typeof(string),
typeof(StatusTextBlock),
new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.None, StatusTextBlock.StatusTextPropertyChangedCallback, null));
private static readonly Regex UriMatchingRegex = new Regex(@"(?<url>[a-zA-Z]+:\/\/[a-zA-Z0-9]+([\-\.]{1}[a-zA-Z0-9]+)*\.[a-zA-Z]{2,5}(:[0-9]{1,5})?([a-zA-Z0-9_\-\.\~\%\+\?\=\&\;\|/]*)?)|(?<emailAddress>[^\s][email protected][a-zA-Z0-9]+([\-\.]{1}[a-zA-Z0-9]+)*\.[a-zA-Z]{2,5})|(?<toTwitterScreenName>\@[a-zA-Z0-9\-_]+)", RegexOptions.Compiled);
#endregion
#region Constructors
public StatusTextBlock()
{
}
#endregion
#region Type specific properties
public string StatusText
{
get
{
return (string)this.GetValue(StatusTextBlock.StatusTextProperty);
}
set
{
this.SetValue(StatusTextBlock.StatusTextProperty, value);
}
}
#endregion
#region Helper methods
internal static IEnumerable<Inline> GenerateInlinesFromRawEntryText(string entryText)
{
int startIndex = 0;
Match match = StatusTextBlock.UriMatchingRegex.Match(entryText);
while(match.Success)
{
if(startIndex != match.Index)
{
yield return new Run(StatusTextBlock.DecodeStatusEntryText(entryText.Substring(startIndex, match.Index - startIndex)));
}
Hyperlink hyperLink = new Hyperlink(new Run(match.Value));
string uri = match.Value;
if(match.Groups["emailAddress"].Success)
{
uri = "mailto:" + uri;
}
else if(match.Groups["toTwitterScreenName"].Success)
{
uri = "http://twitter.com/" + uri.Substring(1);
}
hyperLink.NavigateUri = new Uri(uri);
yield return hyperLink;
startIndex = match.Index + match.Length;
match = match.NextMatch();
}
if(startIndex != entryText.Length)
{
yield return new Run(StatusTextBlock.DecodeStatusEntryText(entryText.Substring(startIndex)));
}
}
internal static string DecodeStatusEntryText(string text)
{
return text.Replace(">", ">").Replace("<", "<");
}
private static void StatusTextPropertyChangedCallback(DependencyObject target, DependencyPropertyChangedEventArgs eventArgs)
{
StatusTextBlock targetStatusEntryTextBlock = (StatusTextBlock)target;
targetStatusEntryTextBlock.Inlines.Clear();
string newValue = eventArgs.NewValue as string;
if(newValue != null)
{
targetStatusEntryTextBlock.Inlines.AddRange(StatusTextBlock.GenerateInlinesFromRawEntryText(newValue));
}
}
#endregion
}
Смежные вопросы
- 1. Как установить видимость TextBlock, связанного с ListBox?
- 2. Части строки, выделенные жирным шрифтом
- 3. Связывание части «TextBlock» в UWP
- 4. Vim, почему у меня есть выделенные части?
- 5. Как сделать выделенные маркеры Карты Google?
- 6. Как сделать выделенные ссылки полужирным шрифтом
- 7. WPF TextBlock динамические жирные и курсивные части
- 8. WPF TextBlock выделяет определенные части в зависимости от условия поиска
- 9. Как извлечь заметки и выделенные части из файлов PDF
- 10. Изменения цвета в части текста в TextBlock
- 11. Как сделать невидимым TextBlock через несколько секунд?
- 12. Как сделать TextBlock прокручиваемым в WPF
- 13. Как сделать Windows Store App TextBlock доступным?
- 14. Как получить все выделенные элементы
- 15. Android: выделенные кнопки навигации в нижней части экрана, Split Actionbar?
- 16. Добавление узла к передней части связанного списка
- 17. Как сделать выделенные столбцы одинаковой шириной в таблице PowerPoint?
- 18. как сделать группу «unhighlight» на выделенные строки в таблице
- 19. Как сделать выделенные флажки с использованием массива для данных
- 20. Как сделать выделенные элементы в ретрансляторе полужирным шрифтом
- 21. Как сделать взаимоисключающие выделенные ссылки с помощью javascript?
- 22. Как сделать части спрайта прозрачными?
- 23. Как сделать полный код связанного списка?
- 24. TextBlock отказывается ~ 70% времени, чтобы сделать гиперссылку
- 25. Как отобразить ошибки проверки на silverlight TextBlock
- 26. Как сделать TextBlock появляться/исчезать на основе свойства привязки другого TextBlock?
- 27. Как очистить TextBlock
- 28. Поместите TextBlock поверх другого TextBlock
- 29. Синтаксис Выделенные значения
- 30. Сохраните выделенные строки как Объект
Вы можете по-разному покрасить текст с помощью этого подхода? –
Несомненно, вы просто задали свойство Foreground экземпляра Run для любой кисти, которую хотите. –
Вы когда-нибудь пытались создать текстовое поле с таким же типом, текстовое поле не имеет встроенного свойства, поэтому вы должны пойти в богатое текстовое поле, я полагаю. –