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;
}
我有一个附有工具提示的按钮。
工具提示中有数据绑定信息。
我在点击和鼠标悬停时显示工具提示。
使用代码:
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;
}