It looks a very common request and so easy a task to mention, but proves to be not all all.
If some code like the following is written, there will be no problem to compile;
PushButtonData cnt1Panel_grp1_item3Data = new PushButtonData("cnt1Panel_grp1_item3", @"", assemFullName, "RevitAddinCSProject.ExtCmd2");
PushButton cnt1Panel_grp1_item3 = cnt1Panel_grp1.AddPushButton(cnt1Panel_grp1_item3Data) as PushButton;
cnt1Panel_grp1_item3.ToolTip = @"PushButton 2 Tooltip";
cnt1Panel_grp1_item3.LargeImage = BmpImageSource(@"RevitAddinCSProject.Resources.BigB.bmp");
but Revit would complain something as follows when the addin containing the code is being loaded:
"Autodesk.Revit.Exceptions.ArgumentException: The value cannot be empty.
Parameter name: Text
at APIUtility.verifyStringArgumentsIsNotNullOrEmpty(String argument, String argName)
...
..."
Not just the true empty string as "" here or String.Empty would cause problems like this, a lot of more other empty string variations such as "\n" and "\t" as the PushButton text would abort Revit the same hard way.
Ouch! Since Revit has a lot of Ribbon buttons without TEXT at all, not sure why the Revit API exposes a severe but useless limitation as such. Doesn't it like adding feet when drawing snakes?
Anyway, we found a workaround to the problem, finally!