【问题标题】:WPF - Tooltip Databinding not working when setting IsOpen=trueWPF - 设置 IsOpen=true 时工具提示数据绑定不起作用
【发布时间】:2023-03-28 04:20:01
【问题描述】:

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

ToolTip 中有数据绑定信息。

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

通过使用代码:

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里面有数据绑定信息,在哪里?请发布 xaml。
  • @Sinatr 添加了 xaml 代码
  • ControlTemplate 通常使用TemplateBinding。我不太确定普通绑定是否有效(您可能需要使用一些技巧,例如this)。你真的需要这里的模板吗?尝试简单地将 Border 和孩子放在工具提示内容中。
  • 点击按钮总是会显示带有空白值的工具提示吗?还是仅在您将鼠标悬停在其上之前?如果悬停后点击它,是否仍然是同样的问题?

标签: c# wpf data-binding


【解决方案1】:

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

因此您可以使用此解决方案:将 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多