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

标签 c# wpf data-binding

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

工具提示内有数据绑定(bind)信息。

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

通过使用代码:

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

如果我单击该按钮,则会显示工具提示,但不显示数据值。

enter image description here

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

enter image description here

重要

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

所以我猜测当我调用tt.IsOpen = true时,我需要对工具提示进行某种调用以获取数据绑定(bind)信息

如何通过手动调用来实现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 属性已正确设置,并且您的绑定(bind)可以正常工作。

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

<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;
}

关于c# - WPF - 设置 IsOpen=true 时工具提示数据绑定(bind)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28988378/

相关文章:

C# HttpClient刷新 token 策略

c# - WPF Listview中的多选和多种样式

.net - 如何立即释放WPF应用程序中的内存以便它可以反射(reflect)在TaskManager中?

wpf - 将静态方法/函数绑定(bind)到 XAML 中的 Func<T> 属性

c# - 如何使 Flash ActiveX 控件在部署机器上兼容?

c# - 避免我的应用程序使用打印屏幕进行捕获

javascript - 尝试在 ES6 中创建 angularJS 指令。尝试双向数据绑定(bind)时出错

data-binding - knockout 将文本标签绑定(bind)到下拉值选定的选项文本

c# - 使用dia-sdk从microsoft pdb文件加载数据

c# - 接受来自按钮的命令参数到 DelegateCommand