繁体   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