2

TextBox小さなヘルプアイコンとともにを表示するユーザーコントロールがあります。

私の目標は、ToolTipポップアップを表示し、データバインドされたテキストを表示し、マウスをヘルプアイコンの上に置いたときに開いたままにすることです。

そのために、ユーザーコントロールにHelpText依存関係プロパティを作成し、ヘルプテキスト文字列をユーザーコントロールにバインドできるようにしました。

だから、私のユーザーコントロールは次のようになります

<UserControl Name="textField" ...>
    <StackPanel Orientation="Horizontal">
        <TextBox Text="{Binding ElementName=textField,Path=Text}"/>
        <Image Source="{StaticResource Help.Icon}">
            <Image.ToolTip>
                <ToolTip Content="{Binding ElementName=textField,Path=HelpText}"/>
            </Image.ToolTip>
        </Image>
    </StackPanel>
</UserControl>

このコードは、空であることを除いて、ツールチップを示しています。また、ツールチップが数秒後にシャットダウンするため、StaysOpenプロパティは何の違いもありません。

面白いことに、ImageコントロールのToolTipプロパティに同じバインディングを直接設定すると、バインドされたテキストがツールチップポップアップに正しく表示されますが、それでも開いたままにはなりません。

<Image Source="{StaticResource Help.Icon}" ToolTip="{Binding ElementName=textField,Path=HelpText}">

だから私の質問は次のとおりです。

  1. ユーザーコントロールのHelpText依存関係プロパティに対するバインディングが最初のコードサンプルでは機能しないのに、2番目のコードサンプルでは機能するのはなぜですか?
  2. 開いたままにするToolTip方法、またはToolTip両方を開いたままにしてデータバインドされたテキストを表示するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

13

ツールチップは、XAMLの他の部分と同じVisualTreeの一部ではDataContextないため、期待どおりに継承されません。

書き込むToolTip="{Binding SomeProperty}"と、ツールチップが自動的にに設定されますDataContextSomeProperty、カスタムツールチップを作成する場合は、自分でこれを行う必要があります。

<ToolTip DataContext="{Binding PlacementTarget.DataContext, 
        RelativeSource={RelativeSource Self}}" ... />

DataContextこれにより、ツールチップが、ツールチップ上にあるオブジェクトのオブジェクトにバインドDataContextされます。

あなたがやろうとしていることを達成するために、あなた<ToolTip>はおそらくこのように見えるでしょう、なぜならPlacementTargetあなたのImage

<!-- Could also use something like Tag if DataContext is actually used -->
<Image DataContext="{Binding ElementName=textField, Path=HelpText}" 
       Source="{StaticResource Help.Icon}">
    <Image.ToolTip>
        <ToolTip Content="{Binding PlacementTarget.DataContext, 
            RelativeSource={RelativeSource Self}}"/>
    </Image.ToolTip>
</Image>

開いたままにならない理由については、私は肯定的ではありませんが、ToolTipService.ShowDurationプロパティがデフォルトで5秒に設定されているためである可能性があり、おそらくStaysOpenプロパティが上書きされます。

たとえば、より高い値に設定してみることができます

<Image ToolTipService.ShowDuration="60000" ... />

または、代わりにスタイルを使用してこの回避策を試すこともできます。コードはおそらく次のようになります。PopupToolTip

<Popup PlacementTarget="{Binding ElementName=MyImage}" 
       IsOpen="{Binding IsMouseOver, ElementName=MyImage, Mode=OneWay}">
    <TextBlock Text="{Binding ElementName=textField, Path=HelpText}" />
</Popup>
于 2013-02-07T16:05:13.817 に答える