WPF - 设置 IsOpen=true 时工具提示数据绑定不起作用

WPF - Tooltip Databinding not working when setting IsOpen=true

我有一个附有工具提示的按钮。

工具提示中有数据绑定信息。

我在点击和鼠标悬停时显示工具提示。

使用代码:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        Button btn = sender as Button;
        tt = btn.ToolTip as ToolTip;
        tt.IsOpen = true;
    }

如果我单击按钮,会显示工具提示,但没有数据值。

但是如果我将鼠标悬停在按钮上,它会正确显示。

重要

如果我先将鼠标悬停在它上面,得到工具提示,将鼠标移开,然后再次过来单击,它会正确显示。

所以我猜想当我调用 tt.IsOpen = true

时,我需要对工具提示进行某种调用以获取数据绑定信息

如何通过手动调用实现tooltip的完整显示?

提前致谢。

更新

xaml代码。

<Button Content="{x:Static prop:strings.Info}" Margin="2" HorizontalAlignment="Center" Click="Button_Click" >
                                <Button.ToolTip>
                                    <ToolTip>
                                        <ToolTip.Template>
                                            <ControlTemplate TargetType="ToolTip">
                                                <Border BorderBrush="Blue" BorderThickness="1" Background="White" CornerRadius="5">
                                                    <StackPanel Orientation="Vertical">
                                                        <DockPanel>
                                                            <TextBlock Text="{x:Static prop:strings.Laenge}" Margin="10" DockPanel.Dock="Left"/>
                                                            <TextBlock Text="{Binding LaengeD}"  Margin="10" DockPanel.Dock="Right" />
                                                        </DockPanel>
                                                        <DockPanel >
                                                            <TextBlock Text="{x:Static prop:strings.Breite}" Margin="10" DockPanel.Dock="Left"/>
                                                            <TextBlock Text="{Binding BreiteD}"  Margin="10" DockPanel.Dock="Right"/>
                                                        </DockPanel>
                                                        <DockPanel>
                                                            <TextBlock Text="{x:Static prop:strings.Hoehe}" Margin="10" DockPanel.Dock="Left"/>
                                                            <TextBlock Text="{Binding HoeheD}"  Margin="10" DockPanel.Dock="Right"/>
                                                        </DockPanel>
                                                        <DockPanel>
                                                            <TextBlock Text="{x:Static prop:strings.Gewicht}" Margin="10" DockPanel.Dock="Left"/>
                                                            <TextBlock Text="{Binding Gewicht}"  Margin="10" DockPanel.Dock="Right"/>
                                                        </DockPanel>
                                                    </StackPanel>
                                                </Border>
                                            </ControlTemplate>
                                        </ToolTip.Template>
                                    </ToolTip>
                                </Button.ToolTip>
                            </Button>

当您的 Tooltip 被隐藏时,它的 PlacementTarget 属性 被设置为 null 并且它没有链接到您按钮的逻辑树。 在这种情况下,您的 {Binding LaengeD} 无法检索到正确的值。 另一方面,如果您将鼠标悬停在按钮上,则 PlacementTarget 属性 已正确设置并且您的绑定可以工作。

因此您可以使用此解决方案:将 DataContext 绑定添加到您的工具提示

<Button Content="Click me" Margin="2" HorizontalAlignment="Center" Click="Button_Click" >
    <Button.ToolTip>
        <ToolTip DataContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={x:Static RelativeSource.Self}}">
            <ToolTip.Template>
                <ControlTemplate TargetType="ToolTip">
                    <Border BorderBrush="Blue" BorderThickness="1" Background="White" CornerRadius="5">
                        <StackPanel Orientation="Vertical">
                            <DockPanel>
                                <TextBlock Text="Laenge" Margin="10" DockPanel.Dock="Left"/>
                                <TextBlock Text="{Binding LaengeD}" Margin="10" DockPanel.Dock="Right" />
                            </DockPanel>
                        </StackPanel>
                    </Border>
                </ControlTemplate>
            </ToolTip.Template>
        </ToolTip>
    </Button.ToolTip>
</Button>

然后以这种方式更改您的点击事件处理程序:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button btn = sender as Button;
    ToolTip tt = btn.ToolTip as ToolTip;

    if (tt.PlacementTarget == null)
    {
        tt.PlacementTarget = btn;
    }

    tt.IsOpen = true;
}