<p>It seems like a standard requirement: next time the user launches the application, open the window in the same position and state as it was before. Here's my wish list:</p>

<ul>
<li>Window position same as it was

<ul>
<li>Unless the screen has resized and the old position is now off screen.</li>
</ul></li>
<li>Splitters should retain their position</li>
<li>Tab containers should retain their selection</li>
<li>Some dropdowns should retain their selection</li>
<li>Window state (maximize, minimize, normal) is the same as it was.

<ul>
<li>Maybe you should never start minimized, I haven't decided.</li>
</ul></li>
</ul>

<p>I'll add my current solutions as an answer along with the limitations.</p>

The simplest solution I've found is to use data binding with the application settings. I bind the location and clientSize properties on the window along with the splitterDistance on the splitter.
Drawbacks:
If you close the window while minimized, it opens hidden the next time. It's really hard to get the window back.
If you close the window while maximized, it opens filling the whole screen, but not maximized (minor issue).
Resizing the window using the top-right corner or the bottom-left corner is just ugly. I guess the two databound properties are fighting each other.
If you'd like to experiment with the strange behaviour, I posted a
sample solution
using this technique.