如何在WPF中修复表情符号

问题描述

我将此库https://www.nuget.org/packages/Emoji.Wpf用于我的应用程序中的表情符号。 但我有问题。

<emoji:Picker x:Name="mypicker" FontSize="40" Cursor="None"  SelectionChanged="mypicker_SelectionChanged" Loaded="mypicker_Loaded"   /> 
<TextBox  x:Name="mytxt"  />

在SelectionChanged中:

var emoji = mypicker.Selection;
mytxt.Text = mytxt.Text + emoji ;

如果我单击一个表情符号,它会起作用,但是如果我再次单击它,则它不会起作用。我该如何解决

解决方法

使用后尝试撤消选择:

var emoji = mypicker.Selection;
mytxt.Text = mytxt.Text + emoji ;
mypicker.Selection = null; // Or =""

该解决方案的一种变体,其中包含PreviewMouseLeftButtonDown,PreviewMouseLeftButtonUp和LostFocus

    <emoji:Picker x:Name="mypicker" FontSize="40"
                  SelectionChanged="mypicker_SelectionChanged"
                  Loaded="mypicker_Loaded" 
                  PreviewMouseLeftButtonDown="MouseButtonHandler"
                  PreviewMouseLeftButtonUp="MouseButtonHandler"
                  LostFocus="mypicker_LostFocus"/>
    <TextBox  x:Name="mytxt"  />

隐藏代码

    private void mypicker_SelectionChanged(object sender,System.ComponentModel.PropertyChangedEventArgs e)
    {
        AddEmoji();
    }

    private void AddEmoji()
    {
        var emoji = mypicker.Selection;
        mytxt.Text = mytxt.Text + emoji;
    }
    bool isLostFocus;

    private void MouseButtonHandler(object sender,MouseButtonEventArgs e)
    {
        Debug.WriteLine(e.RoutedEvent.Name);

        switch (e.RoutedEvent.Name)
        {
            case nameof(PreviewMouseLeftButtonDown):
                isLostFocus = false;
                break;
            case nameof(PreviewMouseLeftButtonUp):
                if (isLostFocus)
                    AddEmoji();
                break;
          default:
                break;
        }

    }

    private void mypicker_LostFocus(object sender,RoutedEventArgs e)
    {
        Debug.WriteLine(e.RoutedEvent.Name);
                isLostFocus = true;

    }
,

这是预期的行为,因为如果选择更改,则只会触发SelectionChanged事件。如果您两次选择相同的表情符号,则所选项目未更改。

您使用的Picker控件有一个内部Popup,但没有公开PopupClosed或类似ItemSelected之类的事件。由于所有字段和方法均为privateinternal,因此除使用反射(我不建议这样做)外,派生自定义类型不起作用。

也不建议在Selected事件处理程序中将null属性设置为SelectionChanged,因为Picker按钮只会显示问号而不是表情符号({ {1}}),但如果对您有用,您可以这样做。

另一种方法是创建一个单独的按钮,以便在文本中插入表情符号,并保留???仅用于选择表情符号。