Here’s my solution.

 

        const int spacing = 12;

        _buttonCancel.Location = new Point(this.ClientSize - _buttonCancel.Size - new Size(spacing, spacing));

        _buttonOK.Location = _buttonCancel.Location - new Size(spacing + _buttonCancel.Width, 0);

 

It’s pretty short. 

 

I didn’t create any new types to solve the problem, but there is still an important OO lesson to be learned here.  As much as possible, I tried to deal with higher order types.  See that I used arithmetic on Point and Size types, instead of on X and Y coordinates, for the most part.  The only exception is the “spacing + _buttonCancel.Width” expression in the last line.  I could have created a pair of Size objects, I suppose:

 

        const int spacing = 12;

        _buttonCancel.Location = new Point(this.ClientSize - _buttonCancel.Size - new Size(spacing, spacing));

        _buttonOK.Location = _buttonCancel.Location - new Size(spacing, 0) - new Size(_buttonCancel.Width, 0);

 

I’m not sure whether that’s an improvement or not. Your thoughts?

 

My real solution (the one I checked in to our source control) has 2 differences from the above code:

1.     I extracted 2 methods

2.     I included some comments

 

Here is what I actually checked in:

        void HACK_ResetButtonLocations()

        {

            const int spacing = 12;

 

            HACK_PlaceCancelButton(spacing);

            HACK_PlaceOKButton(spacing);

 

            this.PerformLayout();

        }

        void HACK_PlaceCancelButton(int spacing)

        {

            // place the Cancel button from the bottom-right corner of the form

            ButtonCancel.Location = new Point(this.ClientSize - ButtonCancel.Size - new Size(spacing, spacing));

        }

        void HACK_PlaceOKButton(int spacing)

        {

            // place the OK button from the Cancel button

            ButtonOK.Location = ButtonCancel.Location - new Size(spacing + ButtonCancel.Width, 0);

        }

 

I have an unpleasant taste in my mouth, still.  None of the solutions I’ve seen, including my own, seem clean & elegant.  Maybe one of you will read this and think of something better?

 

Hopefully in a few days the bug that I’m working around will be fixed in the internal build, and I can go back to using anchoring.