I've been programming since I was 7 years old and in many languages, but there's always something you can learn by reading other people's code - whether it's a more elegant way to implement a certain pattern or algorithm in code, or a completely different idiom, like pattern matching in F# which I have recently been learning, learning a language is not quite enough to become proficient.  It takes time and practice writing things to become proficient at English, and time and practice writing code to become proficient at that as well.  Most languages are similiar, so it's more a style thing than trying to write in a foreign language, but there are exceptions in programming languages.  Learning a lot of very DIFFERENT languages is pretty important to increase your awareness of what is possible, what is not and what should be in your current language of choice (or your bosses).

As for learning frameworks - that's a matter of variety.  The variety of things you TRY to implement will lead you to various corners of the framework you are using, and expose you to different libraries.  Programming a Windows Forms application versus a Windows Service versus an ASP.NET application or Enterprise Services derived class, will expose you to various areas of the framework that you can't learn just by reading - it would take far too long.