我开发了一个WPF示例项目。
这是主窗口的XAML标记:
<Window x:Class="ToolTipSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
WindowState="Maximized">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Button Click="OnButtonClick">Show ToolTip</Button>
<StatusBar Grid.Row="2">
<StatusBarItem>
<TextBlock Text="TextBlock With ToolTip">
<TextBlock.ToolTip>
<ToolTip x:Name="m_toolTip">
ToolTip
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
</StatusBarItem>
</StatusBar>
</Grid>
</Window>
这是主窗口的代码隐藏,没有using语句:
namespace ToolTipSample
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OnButtonClick(object p_sender, RoutedEventArgs p_args)
{
m_toolTip.IsOpen = true;
}
}
}
我希望在单击按钮时以编程方式显示工具提示 我希望ToolTip显示在TextBlock父级之上。
当鼠标光标位于TextBlock上方且在恒定时间C内大约等于5秒时,将自动显示工具提示。
我想在单击按钮时在C期间显示工具提示。
目前的项目没有实现我的目标 单击按钮时显示工具提示:
但是:
我需要做些什么才能实现目标?
任何帮助将不胜感激。
答案 0 :(得分:8)
你有很多问题。第一个也是最简单的解决方法是你只是打开而不是关闭ToolTip
。您说我希望在点击按钮的同一时间内显示工具提示,这很容易实现处理PreviewMouseDown
和PreviewMouseUp
事件:
private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
m_toolTip.PlacementTarget = PlacementTarget;
m_toolTip.IsOpen = true;
}
private void Button_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
m_toolTip.IsOpen = false;
}
...
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Button PreviewMouseDown="Button_PreviewMouseDown"
PreviewMouseUp="Button_PreviewMouseUp">Show ToolTip</Button>
<StatusBar Grid.Row="2">
<StatusBarItem>
<TextBlock Name="PlacementTarget" Text="TextBlock With ToolTip">
<TextBlock.ToolTip>
<ToolTip x:Name="m_toolTip" Placement="Top" HorizontalOffset="50"
VerticalOffset="-5">ToolTip</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
</StatusBarItem>
</StatusBar>
</Grid>
你的另一个问题稍微难以解决......在我看来好像你ToolTip
的定位可能涉及一些错误。通常情况下,尽管@icebat说过, 可以使用ToolTip.Placement
property来改变ToolTip
的位置。这可以设置为PlacementMode
Enumerations之一。
默认值为Mouse
,这是MSDN上链接页面的定义:
Popup控件的位置,使其上边缘与鼠标边界框的下边缘对齐,并使其左边缘与鼠标边界框的左边缘对齐。如果下部屏幕边缘遮挡了弹出窗口,则会重新定位自身以与鼠标边界框的上边缘对齐。如果上部屏幕边缘遮挡了弹出窗口,则控件会重新定位自身以与上部屏幕边缘对齐。
这解释了ToolTip
远离TextBlock
展示位置目标的原因...因为Button
因此鼠标(点击时)远离TextBlock
}。但是,通过将Placement
属性设置为另一个值,可以实现多种位置。但是,仅设置Placement
属性的不同值,只会在屏幕左上角显示ToolTip
。
要解决这种情况,您还应将ToolTip.PlacementTarget
Property设置为注释中正确注明的@icebat,但显然只能从代码中注明。设置PlacementTarget
属性后,Placement
属性值将按预期工作。从这个链接页面:
您可以通过设置PlacementTarget,PlacementRectangle,Placement,HorizontalOffset和VerticalOffsetProperty属性来定位工具提示。
答案 1 :(得分:3)
我实现了目标 谢里丹的回答和评论对我有帮助 我已经更新了我的示例项目 单击按钮时,工具提示现在显示在TextBlock的正上方 并且Timer的回调方法会在等于2500 ms的恒定时间后关闭ToolTip。
这是更新的主窗口的XAML标记:
<Window x:Class="ToolTipSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
WindowState="Maximized">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Button Click="OnButtonClick">Show ToolTip</Button>
<StatusBar Grid.Row="2">
<StatusBarItem>
<TextBlock Width="900" />
</StatusBarItem>
<StatusBarItem>
<TextBlock x:Name="m_statusMessage" Text="TextBlock With ToolTip" ToolTipService.ShowDuration="30000">
<TextBlock.ToolTip>
<ToolTip x:Name="m_toolTip" Placement="Top">
<TextBlock>
ToolTip ToolTipToolTipToolTipToolTipToo lTipToolTipToolTipT oolTipToolTipT
<LineBreak />
oolTipToolTi pToolTipToo lTipToolTipToolTipToolTipToolTipTo olTipToolTipToolTipTool
<LineBreak />
TipToo lTipToolTipToolTipToo lTipToolTipTo olTipToolTip
</TextBlock>
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
</StatusBarItem>
</StatusBar>
</Grid>
</Window>
这是更新的主窗口代码隐藏,没有using语句:
namespace ToolTipSample
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private Timer m_toolTipClosingTimer;
public MainWindow()
{
InitializeComponent();
m_toolTipClosingTimer = new Timer(ToolTipClosingCallBack, null, Timeout.Infinite, Timeout.Infinite);
}
private void OnButtonClick(object p_sender, RoutedEventArgs p_args)
{
m_toolTip.PlacementTarget = m_statusMessage;
m_toolTip.IsOpen = true;
m_toolTipClosingTimer.Change(2500, Timeout.Infinite);
}
private void ToolTipClosingCallBack(object p_useless)
{
Dispatcher.Invoke(() =>
{
m_toolTip.IsOpen = false;
});
}
}
}