2016-05-09 24 views
3

Borderの要素にいくつかのTextBlock要素を追加しています。 Inlinesを追加して、TextBlockのテキストを追加して整形しています。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

です。コンバータでInLineを作成することはできますが、面倒です。 FlowDocumentビューアでFlowDocumentを実行できます。 – Paparazzi

+0

あなたの要件をはっきりと理解するには、Border_ClickedイベントでBoldテキスト(Hello)を取得したいと教えてください。 – Davy

+0

[この回答](http://stackoverflow.com/a/5263094/1997232)に従って、単に 'FontWeight'プロパティを設定できませんか? 'myText.Inlines.Add(new Run(" Bold text "){FontWeight = FontWeight.Bold}); ' – Sinatr

答えて

2

@Helen、TextRangeを使用してTextPointerからテキストを取得する方法があります。

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"を作成することを検討すべきだと思います。使用

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

<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 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

ありがとうございます。しかし、私はメッセージボックスのテキストを 'TextBox'に出力したくありません。 TextBox.Textに 'Bold'を割り当てることはできません。 –

+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 }); 

のようにインラインで追加することができた場合、それは私がインラインXAMLで直接のみ有効であると考え

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

ɫ1あなたはInline to Runをキャストすることができませんでした。 – person27

関連する問題