This is quite an artificial problem. How come it could be a problem? If you need to access to something, you need to address it by name, right? But it does not have to be direct. As you create and insert controls somewhere in the very beginning, but you need to access them from time to time, those names should be the names of some class/structure instance members, right? Most natural place should be the class of your window or a form which host your stack panel with forms.
So, when you first create a control, its constructor always return the reference to it. You already used this reference to insert a control in a panel. Assign this reference to some member of your class, a field or a property; it depends on how you want to use it.
It was about direct access. This is not what you always want. Sometime you have many controls of the similar purpose which you want to keep in an array or some other collection. In this way, you should only keep a reference to the array of some collection as an instance member of your class. In this case, the references to individual controls will be accessed by index, or by some key, if this is a key-value based collection. Please see:
http://msdn.microsoft.com/en-us/library/9b9dty7d.aspx[
^],
http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx[
^].
—SA