Silverlight 4:如何在键盘焦点上显示工具提示(修订)

Posted

技术标签:

【中文标题】Silverlight 4:如何在键盘焦点上显示工具提示(修订)【英文标题】:Silverlight 4: how to show ToolTip on keyboard focus (revised) 【发布时间】:2011-09-27 18:03:57 【问题描述】:

我原来的问题:

是否有一种简单的方法可以在项目获得键盘焦点时显示工具提示,而不仅仅是鼠标悬停?我们有一个带有工具提示的项目列表,用户可能会通过标签浏览这些项目,并且期望的行为是随后也显示工具提示。

添加了示例 XAML。带有 Tooltip 集的 HyperlinkBut​​ton 也需要键盘焦点。

    <DataTemplate x:Key="OfferingItemDT">
        <HyperlinkButton Command="Binding Path=NavigateToLinkCommand" ToolTipService.ToolTip="Binding Tooltip">                
             <Grid x:Name="gOfferingButtonRoot" Width="275" MaxHeight="78" Margin="5,3">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="40"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>

                <Image x:Name="imgServiceOfferingIcon" 
                Grid.RowSpan="2"            
                VerticalAlignment="Top" 
                Source="Binding Path=Image, Converter=StaticResource ByteArrayToImageConverter" 
                Stretch="UniformToFill" 
                Margin="2,10,0,0"
                MaxHeight="32" MaxWidth="32"
                />
                <TextBlock x:Name="txbOfferingTitle"
                    Grid.Column="1"
                    Grid.Row="0"
                    Text="Binding Title"                               
                    TextWrapping="Wrap"                                        
                    Style="StaticResource OfferingTileTitleText"/>
                <TextBlock x:Name="txbOfferingDesc"
                Grid.Column="1"
                Grid.Row="1"
                Style="StaticResource OfferingTileBodyText"
                Text="Binding BriefDescription" />

             </Grid>
        </HyperlinkButton>
    </DataTemplate>             

更新: 根据WPF: Show and persist ToolTip for a Textbox based on the cursor 中的信息以及 Anthony 的 cmets,我在 GotFocus 事件处理程序中尝试了这段代码:

        private void showTooltip(object sender, RoutedEventArgs e)
    
        HyperlinkButton hb = new HyperlinkButton();
        ToolTip ttip = new ToolTip();


        hb = sender as HyperlinkButton;


        ttip = ToolTipService.GetToolTip(hb) as ToolTip;
        ttip.IsOpen = true;            

    

这似乎可行,但 ttip 始终为空。帮忙?

【问题讨论】:

【参考方案1】:

“简单”是主观术语。是的,这很容易。在您附加ToolTip 的同一UI 元素上,您可以挂钩GotFocusLostFocus 事件处理程序,将使用ToolTipService.GetToolTip 获取工具提示并将IsOpen 设置为truefalse分别。

【讨论】:

谢谢。我只是 xaml 的人,所以可以使用更多的帮助。 @dex3703:这太可惜了,因为 *** 是开发人员的地方。作为一个“Xaml 专家”,如果您在问题中包含一些 Xaml 会有所帮助,我可以将其用作更详细答案的基础。 我在一个大型团队中,并试图在代码完成之前帮助不堪重负的开发人员。我已经离开几个月了,这无济于事。 :) Anthony -- 刚刚理解了您的建议并在上面发布了代码。它总是空的——我做错了什么?谢谢!【参考方案2】:

缺少的部分是在 XAML 中定义工具提示,以便我们可以访问 Tooltip 元素。

<HyperlinkButton MouseLeftButtonUp="showTooltip">
  <ToolTipService.ToolTip>
    <ToolTip>
      <TextBlock Text="My tooltip text"/>
    </ToolTip>
  </ToolTipService.ToolTip>
  <!-- ... -->
</HyperlinkButton>

后面的代码

private void showTooltip(object sender, RoutedEventArgs e)

  FrameworkElement frameworkElement = (FrameworkElement)sender;
  ToolTip tooltip = ToolTipService.GetToolTip(frameworkElement) as ToolTip;
  if (tooltip != null)
  
    tooltip.IsOpen = true;
    frameworkElement.MouseLeave += new MouseEventHandler(frameworkElement_MouseLeave);
  


static void frameworkElement_MouseLeave(object sender, MouseEventArgs e)

  FrameworkElement frameworkElement = (FrameworkElement)sender;
  frameworkElement.MouseLeave -= new MouseEventHandler(frameworkElement_MouseLeave);

  ToolTip tooltip = ToolTipService.GetToolTip(frameworkElement) as ToolTip;
  if (tooltip != null)
  
    tooltip.IsOpen = false;
  

【讨论】:

谢谢!我现在无法检查,该项目早已不复存在,但我相信它会在未来出现。

以上是关于Silverlight 4:如何在键盘焦点上显示工具提示(修订)的主要内容,如果未能解决你的问题,请参考以下文章

如何滚动焦点组件以查看在 React JS 中显示的屏幕键盘?

创建和显示布局时如何将焦点设置在视图上?

如何通过在焦点集中时将其移动到键盘顶部/视图中心来突出显示滚动视图中的焦点 UITextField

不应在其焦点上显示软键盘的 Xamarin.Forms 条目

如何发现 TextField 编辑被取消/键盘折叠/焦点丢失

软键盘仅在 EditText 焦点上显示一次