fix #2866: allow Button.Key to be a delegate