WPF:根据光标显示并保留文本框的工具提示

时间:2011-05-06 22:12:57

标签: wpf controls persistence tooltip

此工具提示的目的是显示必须输入的字符串的格式。

我想要实现的功能是:

  1. 当用户将光标放在文本框中时,即当用户选中控件时,应显示工具提示。
  2. 工具提示应根据用户对文本框的输入进行更新(这可以通过绑定来实现)。
  3. 工具提示必须持续,直到用户选中不受控制。
  4. 我想知道所提供的标准工具提示是否具有可用于实现此目的的配置设置,属性......在我的研究中到目前为止我还没有找到任何。如果现有的工具提示不能完成任务,这很可能,我想要一些指针,示例代码来实现这个......

    由于

    Hasanain

4 个答案:

答案 0 :(得分:1)

使用事件触发器,绑定和最小代码隐藏的组合,我设法实现了在用户键入文本框时更新工具提示的行为;当键盘焦点丢失时,工具提示消失。

以下是文本框的xaml:

<TextBox Grid.Column="0" x:Name="txtBxQckTkt" Margin="5,5,0,0" Width="250" ToolTipService.IsEnabled="True" 
                 Text="{Binding QuickTicketText}">
            <TextBox.Triggers>
                <EventTrigger RoutedEvent="TextBox.GotKeyboardFocus">
                    <BeginStoryboard>
                        <Storyboard>
                            <BooleanAnimationUsingKeyFrames
                                Storyboard.TargetName="txtBxQckTktToolTip"
                                Storyboard.TargetProperty="IsOpen">
                                <DiscreteBooleanKeyFrame KeyTime="0:0:0"  Value="False"/>
                                <DiscreteBooleanKeyFrame KeyTime="0:0:0.0001" Value="True" />
                            </BooleanAnimationUsingKeyFrames>
                            <ObjectAnimationUsingKeyFrames Storyboard.TargetName="txtBxQckTktToolTip" 
                                                           Storyboard.TargetProperty="Placement">
                                <DiscreteObjectKeyFrame Value="{x:Static PlacementMode.Bottom}"/>
                            </ObjectAnimationUsingKeyFrames>                                
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
                <EventTrigger RoutedEvent="TextBox.LostKeyboardFocus">
                    <BeginStoryboard>
                        <Storyboard>
                            <BooleanAnimationUsingKeyFrames
                                Storyboard.TargetName="txtBxQckTktToolTip"
                                Storyboard.TargetProperty="IsOpen">
                                <DiscreteBooleanKeyFrame KeyTime="0:0:0"  Value="True"/>
                                <DiscreteBooleanKeyFrame KeyTime="0:0:0.0001" Value="False" />
                            </BooleanAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </TextBox.Triggers>                    
            <TextBox.ToolTip>
                <ToolTip x:Name="txtBxQckTktToolTip" Placement="Bottom" Content="{Binding ToolTip}">                        
                </ToolTip>
            </TextBox.ToolTip>
        </TextBox>

以下是代码隐藏:

txtBxQckTktToolTip.PlacementTarget = txtBxQckTkt;
        _handler = (s, e) =>
                      {
                          var viewModel = DataContext as SingleTradeEntryViewModel;
                          if (viewModel == null) return;

                          viewModel.OnKeyup.Execute(txtBxQckTkt.Text);                              
                      };

        txtBxQckTkt.KeyUp -= _handler;
        txtBxQckTkt.KeyUp += _handler; 

当命令(OnKeyup)执行时,它会引发绑定的ToolTip属性的更改通知,如xaml中所示。

由于

Hasanain

答案 1 :(得分:0)

您可能必须使用弹出控件实现自己的。这里有一些示例XAML可以帮助您入门:

<Button Width="120" Height="30" Name="btn">    
        <Popup IsOpen="True" StaysOpen="True" PlacementTarget="{Binding ElementName=btn}" Placement="Bottom">
            <Button Width="120" Height="30" Content="Button In ToolTip"/>
        </Popup>
</Button>

这里有一些示例代码可以帮助您入门: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/845ffad0-4abf-4830-b206-03f7fe53f74b

答案 2 :(得分:0)

<强> 2 即可。 ToolTip="{Binding Text, ElementName=textBox1, UpdateSourceTrigger=PropertyChanged}"

此处textBox1是您的文本框名称,我已将UpdateSourceTrigger更改为PropertyChanged,因此它会在您键入时更新您的工具提示。

第3 即可。 ToolTipService.ShowDuration="12000"

为此属性提供一个足够长的随机时间,以满足您的需求。

我不完全理解你的第一点,但我认为你需要在你的gotfocus事件处理程序中显示工具提示。这可以通过像gotfocus事件那样实现。

ToolTip toolTip = ToolTipService.GetToolTip(textBox1) as ToolTip;
toolTip.IsOpen = true;

答案 3 :(得分:0)

您可以创建一个触发器,根据控件是否具有焦点来设置工具提示