1

私は素晴らしいテキストブロック(余分なボタンなど)のように動作するInfoBoxというUserControlを作成しました。それはうまく動作します。 「テキスト」は、依存関係プロパティですWPFの子UserControlにTextBlockまたはインラインのコレクションを渡します

<myNS:InfoBox Text="Some Text"/> 

を::

public static readonly DependencyProperty TextProperty = 
    DependencyProperty.Register("Text", typeof(string), typeof(InfoBox), 
    new UIPropertyMetadata(null,ValueChanged)); 

などのように扱わ:

private static void ValueChanged(DependencyObject dpo, 
            DependencyPropertyChangedEventArgs args) 
    { 
     ((InfoBox)dpo).TextBlock.Text = (string)args.NewValue; 
    } 

私はコントロールを追加すると、私はそうのようなブレンドで使用することができますBlendは、Text = "Something"を指定するまで、デザインタイムのサンプルテキストとともに表示されます。この場合、 "Something"が魔法のようにデザイナーに表示されます。完璧!

しかし、私はテキスト以外のものを渡したいと思っています。私はあなたがインラインでテキストブロックを取得するファンキーな機能をすべて使用できるようにしたいと考えています。実行、イタリック体など...

なぜ以下は機能しませんか?

<myNS:InfoBox> 
     <myNS:InfoBox.ReferenceBlock> 
      <TextBlock> 
       <Run Language="en-gb" Text="SampleSample"/><LineBreak/> 
       <Run Language="en-gb"/><LineBreak/> 
       <Run Language="en-gb" Text="MoreMoreMore"/> 
      </TextBlock> 
     <myNS:InfoBox.ReferenceBlock>   
</myNS:InfoBox> 

 public static readonly DependencyProperty ReferenceBlockProperty = 
     DependencyProperty.Register("ReferenceBlock", typeof(TextBlock), 
     typeof(InfoBox), new UIPropertyMetadata(null, ReferenceBlockReceived)); 

[...] 


    private static void ReferenceBlockReceived(DependencyObject dpo, 
      DependencyPropertyChangedEventArgs args) 
    { 
     var textblock = (TextBlock)args.NewValue; 
     if (textblock != null) 
     { 
      ((InfoBox)dpo).TextBlock.Inlines.Clear(); 
      ((InfoBox)dpo).TextBlock.Inlines.AddRange(textblock.Inlines); 
     } 
    } 

何らかの理由でハンドラが受け取ったTextBlockが完全に空です。私はどんな助けにも感謝します。このWPFのものは難しいです!

答えて

0

残念ながら、それほど簡単ではありません。 TextBlockの要素をサポートしますという依存関係プロパティを介してを実行します。インラインと2つのインターフェイスがあります。空白のテキストボックスでこの動作を再現することは可能ですが難しいでしょう。

Jetbrainの無償デコンパイラDotPeekをダウンロードすることをお勧めします。必要なものについて、TextBlockの実装を勉強することができます。

+0

私は実際にその動作を再現しようとしているのではなく、インスタンスまたはテキストブロックのインスタンスのコピーをコントロールに渡します。なぜこれができないのか分かりませんか?いずれにせよ、私はドットペークを見ます、ありがとう –

0

さらにフィルの答えに、私は、objectにごReferenceBlock依存関係プロパティの種類を変更することを示唆している、あなたのカスタムコントロール内ReferenceBlockにバインドContentプロパティでContentControlを使用する - これは、あなたが任意のコンテンツに渡すことができるようになります、など、

<ControlTemplate TargetType="myNS:InfoBox"> 
    <ContentControl Content="{TemplateBinding ReferenceBlock}" /> 
</ControlTemplate> 

これにより、必要に応じてイメージ/コントロール/その他のコンテンツを渡すこともできます。

関連する問題