2016-11-03 6 views
0

いくつかの文字列(className & classID)を渡して、ユーザーがクリックしたハイパーリンクに基づいて異なる変数(classNameClicked & classIDClicked)に格納しようとしています。ここで 文字列を渡して保存する

は、ハイパーリンクを作成するための(C#の)背後に私のコードです:

TextBlock txt = new TextBlock();           
txt.TextWrapping = TextWrapping.Wrap;         
txt.Foreground = Brushes.Black;           
txt.FontFamily = new FontFamily("Times New Roman");      
txt.FontSize = 25;              
txt.Margin = new Thickness(5); 

TextBlock ClassID = new TextBlock(); 
ClassID.Visibility = Visibility.Collapsed; 
ClassID.Text = classID; 

Run run = new Run(className);           
Hyperlink link = new Hyperlink(run);          
link.Click += Link_Click;            
txt.Inlines.Add(ClassID); 
txt.Inlines.Add(link); 

myStackPanel.Children.Add(txt);           
frame.Content = myStackPanel; 

私は以下のコードを使用してハイパーリンクからテキストを抽出することによってclassNameClickedするクラス名から文字列を渡すことができました:

しかし、classIDから文字列を抽出する方法はわかりません。 助けてください。

+2

送信者がハイパーリンクとテキストボックスの両方になることはできないため、null参照例外が発生します。私はコントロールごとに別々の 'Click'ハンドラを持ち、別のメソッドで(共有)コードの残りの部分を持っています。 –

+0

@DStanley私はOPが 'ハイパーリンク 'がクリックされたときに' className'と 'classID'を一度に取得したいと思います。 2つの別々の 'Click'ハンドラーはおそらくこのシナリオでは役に立たないでしょう。しかし、Matによって言及されているように、MVVMは確かに最高のソリューションになるでしょう。 – haindl

答えて

2

Hyperlinkの親を参照してください。

あなたはまた書くことができるLINQを使用したくない場合ので、代わりの

classNameClicked = ((sender as Hyperlink).Inlines.FirstInline as Run).Text; 
classIDClicked = (sender as TextBlock).Text; 

あなたは

Hyperlink link = sender as Hyperlink; 
classNameClicked = (link.Inlines.FirstInline as Run).Text; 
classIDClicked = (link.Parent as TextBlock).Inlines.OfType<Run>().First().Text; 

を書き込むことができます。

classIDClicked = ((link.Parent as TextBlock).Inlines.FirstInline as Run).Text; 

しかし、私は同じことを持っていますコメントでマットとしての全体的な意見。これは実際には醜いですし、MVVMはよりクリーンなコードを書くための道になります。

さらに、nullチェックも追加する必要があります。

編集コメントで要求されるように:あなたは、あなたがHyperlinkTagでそれを隠すことができ、あなたのGUIでclassIDを表示したくない場合は
:ちょうどその

Hyperlink link = new Hyperlink(run); 
link.Tag = classID; 
link.Click += Link_Click; 

そして、あなたはそのための隠されたTextBlockを必要としない

classIDClicked = link.Tag as string; 

:あなたのClickハンドラでそれを得ます。

+0

偉大な答えをありがとう!できます!私はMVVMを学んだはずだったはずですが、私はすでにプロジェクトに参加しており、締め切りはすでに近くにあります。 – syn3rgy

+0

私は最後の質問を1つ尋ねることができたら、 "classID"を隠すことができますか?それでも "classIDClicked"に渡すことができますか?私は自分の投稿を編集しました。 – syn3rgy

+0

@ syn3rgy私は自分の答えを編集しました。私はあなたを助けることができてうれしい。 :-) – haindl

関連する問題