[WPF] WindowStartupLocation.CenterOwner & Height/Width bind
От: HowardLovekraft  
Дата: 19.01.11 07:42
Оценка:
Добрый день всем.

В приложении существует N-е количество диалоговых окон. Все должны появляться c WindowStartupLocation.CenterOwner.
Размеры некоторых из них могут быть изменены пользователем. Хочется запоминать эти размеры и восстанавливать их при следующем появлении диалога. Собственно, с запомнить/восстановить проблем нет.

Суть вопроса.
Контекст данных окна предоставляет 2 свойства — Height и Width. В XAML окна эти свойства связаны с соответствующими свойствами окна:
        WindowStartupLocation="CenterOwner"
        Height="{Binding Height, Mode=TwoWay}"
        Width="{Binding Width, Mode=TwoWay}"

Когда диалог появляется на экране, то его позиция совсем не CenterOwner. Если убрать binding и задать в качестве ширины и высоты окна константы, то все в порядке.

Погуглил. На эту тему существует безответное обращение в connect'е и пара безответных постов на форумах.

Ладно, решил плюнуть на WindowStartupLocation.CenterOwner, установить WindowStartupLocation.Manual, вычислить Left и Top окна (благо, есть доступ к окну-владельцу), выставить их как read-only свойства контекста и привязать их:
        WindowStartupLocation="Manual"
        Height="{Binding Height, Mode=TwoWay}"
        Width="{Binding Width, Mode=TwoWay}"
        Left="{Binding Left, Mode=OneTime}"
        Top="{Binding Top, Mode=OneTime}"

Работает наполовину.
Т.е. если первым идет binding свойства Left, то корректно устанавливается Left окна, а getter свойства Top контекста просто не вызывается.
Если их поменять местами, то корректно установится Top, при этом не вызовется getter свойства Left. Mode=OneWay работает аналогично.

Что я делаю не так?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.