Индикатор выполнения в приложении настройки - PullRequest
2 голосов
/ 29 августа 2009

Я создал настраиваемое действие для своего проекта установки и успешно реализовал форму, которая отображает индикатор выполнения для этапа загрузки в моей установке (в моем коде настраиваемого действия я использую WebClient). Итак, у меня есть два вопроса, которые относятся друг к другу.

  1. Есть ли способ показать индикатор загрузки в главном окне настройки, кроме создания отдельной формы, которую я отображаю, как сделал? Я бы предпочел это.

  2. Если нет, то что я могу сделать, чтобы моя форма отображалась перед фактическим окном настройки при вызове form.ShowDialog ()? Я также вызвал BringToFront (), который тоже не работает. Он есть, но всегда за основным окном настройки. Кажется, должен быть какой-то способ получить правильный z-порядок.

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 17 января 2012

Другой способ сделать это - использовать BackgroundWorker. Вы позволяете фоновому рабочему обрабатывать загрузку файла, чтобы он не препятствовал обновлению пользовательского интерфейса.

Смотрите эту ссылку на donnetperls

0 голосов
/ 01 сентября 2009

Поэтому я отказался от идеи интегрирования индикатора выполнения в экран самого установщика, но просто смешно, что нужно, чтобы форма Windows отображалась сверху. Я должен получить дескриптор в окне установщика и отправить его в фоновом режиме, потому что продвижение окна индикатора выполнения просто не будет работать. Я перешел к разработке Mac сейчас, поэтому возвращаться к этому просто разочаровывает. Я помню, как думал, что C # .NET был довольно крутым. Это не имеет НИЧЕГО на Какао / Objective-C.

Это бесит, когда есть метод с именем BringToFront (), который просто игнорирует вас. Почему мне нужно перейти к коду Windows API, чтобы сделать что-то такое же фундаментальное для графического интерфейса, как управление Z-Order? Z-Order? Серьезно?

Если вам интересно, вот что я в итоге сделал (через Google):

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern bool SetWindowPos(
      IntPtr hWnd, // window handle
      IntPtr hWndInsertAfter, // placement-order handle
      int X, // horizontal position
      int Y, // vertical position
      int cx, // width
      int cy, // height
      uint uFlags); // window positioning flags

public const uint SWP_NOSIZE = 0x1;
public const uint SWP_NOMOVE = 0x2;
public const uint SWP_SHOWWINDOW = 0x40;
public const uint SWP_NOACTIVATE = 0x10;

[DllImport("user32.dll", EntryPoint = "GetWindow")]
public static extern IntPtr GetWindow(
      IntPtr hWnd,
      uint wCmd);

public const uint GW_HWNDFIRST = 0;
public const uint GW_HWNDLAST = 1;
public const uint GW_HWNDNEXT = 2;
public const uint GW_HWNDPREV = 3;

public static void ControlSendToBack(IntPtr control)
{
    bool s = SetWindowPos(
          control,
          GetWindow(control, GW_HWNDLAST),
          0, 0, 0, 0,
          SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
}

Я получаю дескриптор к окну установщика и затем вызываю ControlSendToBack () для него. Это работает, но он отправляет его обратно. Я попробовал другой метод, который просто отправил бы его обратно на одну позицию, но это тоже не сработало. Программирование Windows - так же хорошо, как это было в 1995 году. Круто.

...