2016-05-09 5 views
3

Я добавляю некоторые элементы TextBlock к Border элементам в StackPanel. Я добавляю и формирую текст TextBlock, добавляя Inlines.WPF C# - Получить встроенный полужирный текст из TextBlock

Когда щелкнули, я хочу получить форматированный текст TextBlock. Вот мой код.

public void addText() 
{ 
    TextBlock myText = new TextBlock(); 
    myText.Inlines.Add(new Bold(new Run("Hello "))); 
    myText.Inlines.Add("World!"); 

    Border myBorder = new Border(); 
    myBorder.Child = myText; 
    myBorder.MouseDown += new MouseButtonEventHandler(Border_Clicked); 

    myStackPanel.Children.Add(myBorder); 
} 

private void Border_Clicked(object sender, MouseButtonEventArgs e) 
{ 
    //Border senderBox = (Border)sender; 
    //TextBlock senderText = (TextBlock)senderBox.Child; 
    //Bold inline = (Bold) senderText.Inlines.ElementAt(0); 
    // How to Output "Hello "? 
} 

Border_Clicked должен выводить «Hello». Как вы можете видеть, я могу добраться до полужирного текста, но как я могу его вывести?

+0

Я думаю, что встраивает действительны только непосредственно в XAML. Вы можете создавать InLines в конвертере, но это грязно. Вы можете сделать FlowDocument в средстве просмотра FlowDocument. – Paparazzi

+0

Чтобы четко понять ваше требование, скажите, пожалуйста, что вы хотите получить Жирный текст (Hello) на Border_Clicked событии, правильно? – Davy

+0

Не можете ли вы просто установить свойство 'FontWeight' в соответствии с [этим ответом] (http://stackoverflow.com/a/5263094/1997232)? Что-то вроде 'myText.Inlines.Add (новый Run (« Полужирный текст ») {FontWeight = FontWeight.Bold});' – Sinatr

ответ

2

@Helen, есть способ получить текст из TextPointer с помощью TextRange. Попробуйте использовать этот код

void myBorder_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    var senderBox = (Border)sender; 
    var senderText = (TextBlock)senderBox.Child; 
    var inline = (Bold)senderText.Inlines.ElementAt(0); 

    var textRange = new TextRange(inline.ContentStart, inline.ContentEnd); 
    Console.WriteLine(textRange.Text); 
} 
0

Невозможно управлять характеристиками шрифта в MessageBox. Я думаю, вы должны подумать о создании «пользовательского MessageBox». Что-то вроде этого:

<Window x:Class="WpfApplication1.CustomMessageBox" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     SizeToContent="WidthAndHeight" MaxWidth="400"> 

    <Grid x:Name="GridContent" Margin="10"> 

    </Grid> 
</Window> 

Таким образом, в своем конструкторе вы можете отправить ваш Жирный:

private Bold _text; 
public CustomMessageBox(Bold formattedText) 
{ 
    _text = formattedText; 
    GridContent.Child = _text; 
} 

Использование:

private void Border_Clicked(object sender, MouseButtonEventArgs e) 
{ 
    Border senderBox = (Border)sender; 
    TextBlock senderText = (TextBlock)senderBox.Child; 
    Bold inline = (Bold) senderText.Inlines.ElementAt(0); 
    var customMsgBox = new CustomMessageBox(inline); 
    customMsgBox.ShowModal(); 
} 

Теперь, если вы не уверены, что это будет всегда Жирный объект, я предлагаю вам сохранить форматированный текст в XML и загрузить его после. Взгляните на это: showing formatted text

+0

Спасибо, но я не хочу выводить текст в ящик сообщений, а в текстовый блок. Я не могу назначить 'Bold'' TextBox.Text'. –

+0

Возможно, для этого вам следует использовать RichTextBox. Сохраните свой элемент Bold как xaml и загрузите его в RichTextBox. См. Это: https://msdn.microsoft.com/en-us/library/aa970917(v=vs.100).aspx – quicoli

0

Проблема заключается в получении текста из Bold элементов?

private void Border_Clicked(object sender, MouseButtonEventArgs e) 
{ 
    var border = (Border)sender; 
    var textBlock = (TextBlock)border.Child; 
    var bold = (Bold)textBlock.Inlines.ElementAt(0); 

    // How to Output "Hello "? 

    // try 
    var output = ((Run)bold).Text; 
    // or rather (because Bold is a wrapper) 
    var output = ((Run)bold.Inlines[0]).Text; 
} 

Если вы можете добавить рядный как этот

myText.Inlines.Add(new Run("Bold text") { FontWeight = FontWeight.Bold }); 

то это

var run = (Run)textBlock.Inlines[0]; 
var output = run.Text; 
+0

ɫ1 Не знал, что вы можете использовать Inline для запуска. – person27