簡體   English   中英

如何在 telegram-api 的列中放置一個按鈕(內聯鍵盤)?

[英]How to place a button(inline keyboard) in a column on the telegram-api?

我嘗試為電報機器人創建自定義鍵盤。 使用AmatuerDev的解決方案: 在 c#、MrRoundRobin API 中創建動態鍵盤電報機器人,它看起來像這樣:

行中的按鈕

如何在列中放置按鈕?

感謝您!

聚苯乙烯源代碼:

private static InlineKeyboardButton[][] GetInlineKeyboard(string [] 
stringArray)
{
var keyboardInline = new InlineKeyboardButton[1][];
var keyboardButtons = new InlineKeyboardButton[stringArray.Length];
for (var i = 0; i < stringArray.Length; i++)
{
    keyboardButtons[i] = new InlineKeyboardButton
    {
        Text = stringArray[i],
        CallbackData = "Some Callback Data",
    };
}
keyboardInline[0] = keyboardButtons;
return keyboardInline;
}

筆記:

  1. 更改返回類型GetInlineKeyboardInlineKeyboardMarkup而不是InlineKeyboardButton[][]
  2. 使用顯式類型而不是隱式 ( var )
  3. 使用List<InlineKeyboardButton>而不是 Array ( InlineKeyboardButton[] )
  4. 不要創建具有相同回調數據的按鈕
  5. 替換方法參數以取IDictionary<string, string>獲取文本和回調數據

每個IEnumerable<InlineKeyboardButton>都是單行,這意味着您應該傳遞行列表。

你不應該使用var keyboardInline = new InlineKeyboardButton[1][]; 因為這意味着該行中只有一行帶有按鈕!

下面有兩種方式:


你想要的代碼:

我不建議使用此代碼

private static InlineKeyboardButton[][] GetInlineKeyboard(string[] stringArray)
{
    var keyboardInline = new InlineKeyboardButton[stringArray.Length][];

    for (var i = 0; i < stringArray.Length; i++)
    {
        keyboardInline[i] = new InlineKeyboardButton[]
        {
            new InlineKeyboardButton
            {
                Text = stringArray[i],
                CallbackData = "Some Callback Data",
            };
        }
    }

    return keyboardInline;
}

最好的辦法:

我建議使用以下代碼:

private static InlineKeyboardMarkup GetInlineKeyboard(IDictionary<string, string> buttonsData)
{
    // Rows Count
    int count = buttonsData.Length;

    // List of rows 
    // Every 'List<InlineKeyboardButton>' is row
    List<List<InlineKeyboardButton>> buttons = new List<List<InlineKeyboardButton>>(count);    

    for (int i = 0; i < count; i++)
    {
        // Add new row with one button capacity
        buttons.Add(new List<InlineKeyboardButton>(1)
        {
            // Add button to this row
            new InlineKeyboardButton
            {
                Text = buttonsData.Values.ElementAt(i),
                CallbackData = buttonsData.Keys.ElementAt(i),
            }
        });
    }
    
    return new InlineKeyboardMarkup(buttons);
}

我不確定代碼是否發生了巨大變化,因為我沒有嘗試過上述方法(由 Muaath 回答),但這對我來說是解決方法,靈感來自上面的 Muaath 回答:

public async Task<InlineKeyboardMarkup> GetInlineKeyboardMarkup(IReadOnlyList<SomeClassObject> someClassObject)
        {

            int count = someClassObject.Count;
            List<List<InlineKeyboardButton>> buttons = new List<List<InlineKeyboardButton>>(someClassObject.Count);

            for (int i = 0; i < count; i++)
            {
                // Add new row with one button capacity
                buttons.Add(new List<InlineKeyboardButton>(1)
                {
                      InlineKeyboardButton.WithCallbackData(text: $"{someClassObject[i].Title}", callbackData: $"{someClassObject[i].Id}"),
                });
            }

            return new InlineKeyboardMarkup(buttons);
        }

請注意不同之處在於現在有一個新方法: InlineKeyboardButton.WithCallbackData()

根據文檔: https://telegrambots.github.io/book/2/reply-markup.html

您需要將每個按鈕放在數組中。 回復標記:鍵盤和內聯鍵盤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM