【问题标题】:How to show a flyout in where the text in a TextBlock is selected如何在选择 TextBlock 中的文本的位置显示浮出控件
【发布时间】:2019-08-03 21:43:00
【问题描述】:

我想在我的TextBlock 中添加一个浮出控件,当我在 TextBlock 中选择文本时,浮出控件将显示在选定的位置(有点像 Microsoft Edge 中的阅读模式,当您在阅读中选择文本时模式,会有一个弹出窗口显示单词的定义)。但我不知道怎么做。我试过使用SelectionChanged,但是这个事件传递的参数没有我可以用来设置flyout的位置。那么我该怎么做呢? 此外,我想知道SelectionFlyout 是干什么用的?我认为它可以帮助我。 这是我的代码:

<TextBlock x:Name="webviewtest" Grid.Row="1" Text="This is a select-flyout test." FontSize="300" IsTextSelectionEnabled="true" >
    <TextBlock.SelectionFlyout>
        <Flyout>
            <TextBlock Text="this is the flyout"></TextBlock>
        </Flyout>
    </TextBlock.SelectionFlyout>
</TextBlock>

当我选择文本时,弹出窗口从未出现。很明显是我用错了。所以我检查了Microsoft Docs,它说

获取或设置选择文本时显示的浮出控件,如果没有显示浮出控件,则为 null。

我在网上找不到任何关于此的示例。

【问题讨论】:

标签: c# xaml uwp textblock flyout


【解决方案1】:

这可以通过将TextBlock IsTextSelectionEnabled 设置为True 并使用MenuFlyout 来显示选定的文本来实现。

XAML

    <TextBlock x:Name="webviewtest" Text="This is a select-flyout test." FontSize="100"  IsTextSelectionEnabled="True" RightTapped="webviewtest_RightTapped">
        <FlyoutBase.AttachedFlyout>
            <MenuFlyout x:Name="Flyout">
                <MenuFlyout.Items>
                    <MenuFlyoutItem x:Name="FlyItem" Text="">
                    </MenuFlyoutItem>
                </MenuFlyout.Items>
            </MenuFlyout>
        </FlyoutBase.AttachedFlyout>
    </TextBlock>

C#

    private void webviewtest_RightTapped(object sender, RightTappedRoutedEventArgs e)
    {
        TextBlock tb = sender as TextBlock;

        if (tb.SelectedText.Length > 0)
        {
            Item.Text = tb.SelectedText;
        }
        // Show at cursor position
        Flyout.ShowAt(sender as UIElement, e.GetPosition(sender as UIElement));
    }

【讨论】:

  • 抱歉,我错误地删除了问题中的 IsTextSelectionEnabled 属性,我的代码中有该属性。这不是解决方案。我试过你的方法。首先,弹出窗口出现在 TextBlock 上,但没有出现在所选文本上。这听起来可能令人困惑,我应该说我希望它出现在我的光标所在的位置。其次,突出显示文本后出现浮出控件,因为在突出显示之前触发了SelectionChanged。我尝试使用“Tapped”事件。但由于我的 TextBlock 是可选择的,因此除了 RightTapped 事件之外,不会触发任何 'Tapped' 事件。
  • 啊,我现在看到你的问题了。使用RightTapped 事件有什么问题?您当然可以从中获得光标位置。在选择文本后需要有一个用户操作(即点击、双击、右击)才能按照您想要的方式工作。我将根据此更新我的答案,以防它将来对您或某人有所帮助。
  • 因为RightTapped 需要右击,这不是我想要显示浮出控件的方式。我想要实现的是在选择一些文本并释放鼠标(或手指)后显示一个弹出窗口,
  • @Hongjia 你可以使用TextBlock.SelectionChanged
【解决方案2】:

TextBlock 需要使用 RichTextBlock 替换,平台为 17134 及以上。

    <RichTextBlock HorizontalAlignment="Center"
                   VerticalAlignment="Center"
                   IsTextSelectionEnabled="True">
        <RichTextBlock.ContextFlyout>
            <Flyout>
                <TextBlock Text="flyout" />
            </Flyout>
        </RichTextBlock.ContextFlyout>
        <RichTextBlock.SelectionFlyout>
            <Flyout>
                <TextBlock Text="this is the flyout" />
            </Flyout>
        </RichTextBlock.SelectionFlyout>
        <Paragraph>
            welcome to blog.lindexi.com that has many blogs
        </Paragraph>
    </RichTextBlock>

SelectionFlyout 是联系工作的。 TextBlock.SelectionFlyout 不起作用 · 问题 #452 · Microsoft/microsoft-ui-xaml

github中的所有代码

【讨论】:

  • 但是flyout在我右键单击或长按触摸时出现,无论如何flyout在我选择文本并突出显示后立即出现,或者只是使用触摸屏进行简单的触摸?
猜你喜欢
  • 2020-10-09
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2017-08-09
  • 2016-12-08
  • 2014-04-03
  • 1970-01-01
相关资源
最近更新 更多