WPF и оконная черепица - PullRequest
       8

WPF и оконная черепица

1 голос
/ 10 апреля 2010

У меня есть приложение WPF, которое всегда будет работать в Windows 7, оно открывается и отображается в полноэкранном режиме

В приложении WPF есть кнопка, которая открывает Word

Я бы хотел, чтобы приложение WPF при открытии Word отправляло команду операционной системе, чтобы оно располагало окна приложения WPF и приложения Word рядом друг с другом, чтобы каждое из них занимало 50% экрана. Это возможно? если да, кто-нибудь знает, какой может быть код? (немного похоже на то, когда вы щелкаете правой кнопкой мыши на панели задач Windows 7 и нажимаете «Показать Windows рядом»)

Ответы [ 3 ]

1 голос
/ 11 апреля 2010

Да, это возможно и относительно легко.

Вы говорите, что у вас уже есть код, который открывает ваше окно WPF "на весь экран". Предполагая, что это действительно полноэкранное представление, а не развернутое окно, вы уже рассчитали прямоугольник экрана. Если нет, вы можете использовать класс Screen из System.Windows.Forms, чтобы получить прямоугольник экрана. Помните, что класс Screen является частью WinForms, поэтому он использует координаты устройства (пиксели) вместо координат, не зависящих от разрешения (96 точек на дюйм), поэтому вам необходимо преобразовать Rectangle в Rect, а затем применить преобразование PresentationSource.FromVisual(window).TransformFromDevice, чтобы получить Координаты WPF.

Если у вас есть экран Rect с независимыми от устройства координатами (96 точек на дюйм), вы должны вычислить отдельные прямоугольники. Например, вот вычисление для 50% горизонтального деления screenRect:

Rect rect1 = new Rect(screenRect.X, screenRect.Y, screenRect.Width/2, screenRect.Height);
Rect rect2 = new Rect(screenRect.X + screenRect.Width/2, screenRect.Y, screenRect.Width/2, screenRect.Height);

Когда у вас есть границы, вы можете просто настроить собственное окно:

window.Left = rect1.X;
window.Top = rect1.Y;
window.Width = rect1.Width;
window.Height = rect1.Height;

Перемещение окна Word немного сложнее. Вы должны преобразовать в координаты устройства, запустить процесс, дождаться инициализации Word, затем вызвать функцию Win32 SetWindowPos. Это должно быть сделано в отдельном потоке, чтобы избежать блокировки пользовательского интерфейса.

// Transform rect2 to device coordinates
rect2.Transform(PresentationSource.FromVisual(window).TransformToDevice);

// Execute the rest of this in a separate thread
ThreadPool.QueueUserWorkItem(_ =>
{
  // Start Word
  var process = Process.Create(pathToWinwordExe);

  // Wait for Word to initialize
  process.WaitForInputIdle();

  // Set the position of the main window
  IntPtr hWnd = process.MainWindowHandle;
  if(hWnd!=IntPtr.Zero)
    SetWindowPos(
      hWnd, IntPtr.Zero,
      (int)rect2.X, (int)rect2.Y, (int)rect2.Width, (int)rect2.Height,
      SWP_NOZORDER);
});

Не забудьте DllImport для SetWindowPos. Примерно так должно работать:

[DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true, ExactSpelling=true)]
public static extern bool SetWindowPos(
  HandleRef hWnd, HandleRef hWndInsertAfter, int x, int y, int cx, int cy, int flags);
0 голосов
/ 12 апреля 2010

Другой способ, который я опробовал, - это вызвать файл vbs после запуска exe-программы в приложении wpf, файл vbs затем отправит команду в систему для вертикальной укладки и т. Д.

dim objShell set objShell = CreateObject ("Shell.Application") objShell.TileVertically установить objShell = ничего

0 голосов
/ 10 апреля 2010

вот обходной путь для этого:

        Window1 window = new Window1();
        double height = SystemParameters.WorkArea.Height;
        double width= SystemParameters.WorkArea.Width;
        this.Height = height;
        this.Width = width / 2;
        this.Left = 0;
        this.Top = 0;
        window.Height = height;
        window.Width = width / 2;
        window.Left = width / 2;
        window.Top = 0;
        window.Show();

Надеюсь, это поможет !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...