2

Button次の問題に対するアドバイスが必要です。テキストフローにを埋め込みたいのですが、ButtonLabel(またはTextBlock)をに埋め込むとWrapPanel、最初の図が表示されます。

代替テキストhttp://sklad.tomaskafka.com/files/wpf-wrappanel-problem.png

解決策の1つは可能性があると思いますがFlowDocument、これはこのような単純な制御(数百のインスタンスで使用できる)には重すぎると感じています。これを実装する方法について他にアイデアはありますか?ありがとうございました!

編集:1つの解決策は次のようになります(もっと多くのものを入れることができるとは知りませんでしたTextBlock)が、バインドする機能を失います(必要です):

<TextBlock TextWrapping="Wrap">
    <Span>
        <Button x:Name="MyButton" Command="{Binding Path=MyCommand}" Content="+" />
        <Run x:Name="MyLabel" Text="{Binding Path=Subject}" />
        <!--
        Problem: binding makes following error:
        A 'Binding' cannot be set on the 'Text' property of type 'Run'. 
        A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
        -->
    </Span>
</TextBlock>
4

4 に答える 4

1

Run.Textにバインドするには、 FortesによるBindableRunクラスをチェックアウトします。実装は簡単で、プロジェクト全体で使用しています。

于 2009-08-16T00:42:07.363 に答える
1

BindableRunを正しく実装するのはかなり難しいことがわかりました。また、他のほとんどすべての利用可能な実装では、バインドされたコンテンツがnullからnull以外に変更されると、wpfレイアウトエンジンから例外が発生します。この問題を参照してください。キーワード「コレクションが変更されました。列挙操作が変更された可能性があります。実行しないでください。」

Microsoftの正しい実装がここにあります-これが実際にどれほどトリッキーであるかを示しています。

于 2009-11-30T00:46:30.427 に答える
0

解決策:BindableRunクラス+次のマークアップ:

<TextBlock>
    <Button x:Name="MyButton" Command="{Binding Path=MyCommand}" Content="+" />
    <common:BindableRun x:Name="Subject" BindableText="{Binding Path=Subject}"/>
</TextBlock>
于 2009-08-16T00:49:28.207 に答える
0

UserControlのデザイナで機能するのはおかしいです...その場合、コントロールのプロパティ変更を使用して値をRunに設定するだけで十分です。つまり、次のようなものがあった場合:

<TextBlock>          
   <Run Text="{Binding ElementName=thisCtrl, Path=Description}" />
</TextBlock>

次に、実行に名前を付け、UserControlDependencyPropertyのプロパティ変更ハンドラーで値を取得/設定します。

于 2010-12-17T18:07:06.997 に答える