CommunityToolkit / CommunityToolkit/Windows

New method to add token to RichSuggestBox

オープン
#710 コメント 2 件 リアクション 2 件 担当者 0 名 GitHub で見る
components::controls::richsuggestbox enhancement feature request :mailbox_with_mail:
主要言語
C#
スター
1.1k
フォーク
166
PR マージ指標
30日以内にマージされた PR はありません

説明

### Describe the bug

As mentioned on [Discord](https://discord.com/channels/372137812037730304/1396899916864819271/1397224971562123426), I would really love a new method on RichSuggestBox that allows the programmatic insertion of a new token.

The use-case for this is something like a toolbar that offers ways to insert tokens. Currently you need to type the prefix, and then use the provided suggestions.

I think it is quite a common case that you want to offer suggestions outside of the provided popup. In the sample people get suggested to at-mention when the user types `@`. But imagine if I want to have a custom menu that enables the user to at-mention the last couple of people they interacted with. This new method would make that quite easy to implement.

### Steps to reproduce

Currently I create the token in a manual way that relies a bit too much on the inner workings of RichSuggestBox:

```csharp
private void AddToken(string displayText, object? tokenData)
{
var guid = Guid.NewGuid();
if (mySuggestBox.TextDocument is not null)
{
mySuggestBox.AddTokens([new(guid, $"({displayText})") { Item = tokenData }]);

mySuggestBox.TextDocument.Selection.SetText(Microsoft.UI.Text.TextSetOptions.Unhide, $"\u200B({displayText})\u200B");
mySuggestBox.TextDocument.Selection.Link = $"\"{guid}\"";
// I move the focus, but probably not needed in the toolkit:
mySuggestBox.Focus(FocusState.Programmatic);
mySuggestBox.TextDocument.Selection.MoveStart(Microsoft.UI.Text.TextRangeUnit.Story, 1);
// note: the new Token is not available in `Tokens` here yet, some processing occurs.
// It seems like the private method `ValidateTokensInDocument()` should be called here.
}
}
```

### Expected behavior

The new method should add a token, allow me to set the displayed text and the associated data. The token should be inserted at the current text selection/position (In my experience the current position is at the end of the document if the user hasn't interacted with the content)

### Screenshots

See the discord for a video of my current use-case

### Code Platform

- [ ] UWP
- [x] WinAppSDK / WinUI 3
- [ ] Web Assembly (WASM)
- [ ] Android
- [ ] iOS
- [ ] MacOS
- [ ] Linux / GTK

### Windows Build Number

- [ ] Windows 10 1809 (Build 17763)
- [ ] Windows 10 1903 (Build 18362)
- [ ] Windows 10 1909 (Build 18363)
- [ ] Windows 10 2004 (Build 19041)
- [ ] Windows 10 20H2 (Build 19042)
- [ ] Windows 10 21H1 (Build 19043)
- [ ] Windows 10 21H2 (Build 19044)
- [ ] Windows 10 22H2 (Build 19045)
- [x] Windows 11 21H2 (Build 22000)
- [ ] Other (specify)

### Other Windows Build number

_No response_

### App minimum and target SDK version

- [ ] Windows 10, version 1809 (Build 17763)
- [ ] Windows 10, version 1903 (Build 18362)
- [ ] Windows 10, version 1909 (Build 18363)
- [ ] Windows 10, version 2004 (Build 19041)
- [x] Windows 10, version 2104 (Build 20348)
- [x] Windows 11, version 22H2 (Build 22000)
- [ ] Other (specify)

### Other SDK version

_No response_

### Visual Studio Version

2022

### Visual Studio Build Number

latest (17.14.9)

### Device form factor

Desktop

### Additional context

I find the tokenized richtextbox a very cool and powerful control, the use-case in the samples centered on suggestions are just the tip of the ice berg.
I did not really look into this yet, but I believe a token must currently start with a punctuation character. But wouldn't it be neat if you could use an emoji? Imagine a paperclip with a document name to reference an attachment. 📎MyReport.pdf

### Help us help you

No, I'm unable to contribute a solution.

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

RichSuggestBox から開始し、既存の AddTokens パスを追跡します。これには、テキスト選択とトークン データがどのように更新されるかも含まれます。期待される動作に基づいて新しいメソッドの動作を定義します。このメソッドは、現在の選択位置に関連データを持つ表示トークンを挿入し、結果として得られるトークンをコントロールの既存のトークン状態から利用できるようにする必要があります。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
csharp
領域
desktop
issue の種類
機能追加
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
45/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。