问题描述
我将此库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
之类的事件。由于所有字段和方法均为private
或internal
,因此除使用反射(我不建议这样做)外,派生自定义类型不起作用。
也不建议在Selected
事件处理程序中将null
属性设置为SelectionChanged
,因为Picker
按钮只会显示问号而不是表情符号({ {1}}),但如果对您有用,您可以这样做。
另一种方法是创建一个单独的按钮,以便在文本中插入表情符号,并保留???
仅用于选择表情符号。