以编程方式显示工具提示

时间:2014-05-15 09:11:21

标签: wpf tooltip

我开发了一个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期间显示工具提示。

目前的项目没有实现我的目标 单击按钮时显示工具提示:

enter image description here

但是:

  • ToolTip与TextBlock父级相距太远。
  • 工具提示不会自动隐藏

我需要做些什么才能实现目标?
任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:8)

你有很多问题。第一个也是最简单的解决方法是你只是打开而不是关闭ToolTip。您说我希望在点击按钮的同一时间内显示工具提示,这很容易实现处理PreviewMouseDownPreviewMouseUp事件:

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,Horizo​​ntalOffset和VerticalOffsetProperty属性来定位工具提示。

enter image description here

答案 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;
                });
        }
    }
}