«Если это невозможно, я просто накапливаю их во временном векторе и в конце вызываю материал Defer, когда я уверен, что хочу сделать их все».
Это было бы правильным решением. Каков ваш аргумент в пользу нерешительности относительно того, какие окна следует перемещать между BeginDeferWindowPos
, DeferWindowPos
и EndDeferWindowPos
? Похоже, это больше относится к проблеме многопоточности, которую вы можете решить, используя соответствующую блокировку.
Arkadiy ответ не отменяет ничего. Насколько я понимаю документация Win32 , , вы просто не можете объединить операции показа / скрытия с операциями изменения положения . Другими словами, вы не отменяете операцию , операции show / hide просто имеют приоритет, и именно они будут выполняться.
Я инкапсулировал отображение / скрытие и изменение положения в управляемой библиотеке: Расширение библиотеки классов Framework .
Специальная функция RepositionWindows()
находится в Whathecode.System.Windows.WindowManager и обеспечивает как отображение / скрытие, так и перемещение.
/// <summary>
/// Reposition a set of windows in one operation.
/// TODO: Handle any scenarios where repositioning windows fails.
/// </summary>
/// <param name="toPosition">The windows to reposition.</param>
/// <param name="changeZOrder">
/// When true, the windows's Z orders are changed to reflect the order of the toPosition list.
/// The first item in the list will appear at the top, while the last item will appear at the bottom.
/// </param>
public static void RepositionWindows( List<RepositionWindowInfo> toPosition, bool changeZOrder = false )
{
bool changeVisibility = toPosition.Any( w => w.HasVisibilityChanged() );
if ( changeVisibility )
{
RepositionWindows( toPosition, false, true );
}
RepositionWindows( toPosition, changeZOrder, false );
}