Показывая окно с WPF, Winforms и Парными мониторами

Добавление ответа @ DacreDenny здесь, чтобы я мог изменить его и добавить примечания.

function animationListener(event) {
  var type = event.type;
  var label = type;
  
  if (type=="animationiteration") {
    if (app.interval!=null) {
      clearInterval(app.interval);
    }
    app.time = 0;
    app.startTime = new Date().getTime();
    app.interval = setInterval(intervalFunction, 15);
    intervalFunction();
    label = "iteration";
  }
  else if (type=="animationstart") {
    label = "start";
  }
  else if (type=="animationend") {
    label = "end";
  }
  
  app.stateLabel.innerHTML = label;
}

function intervalFunction() {
  var currentTime = new Date().getTime();
  var time = (currentTime - app.startTime)/1000;
  var duration = parseFloat(window.getComputedStyle(app.ellipse).animationDuration);
  var maxValue = 100;
  var position = ((time * maxValue)/duration);
  
  app.timeLabel.innerHTML = Math.round(time);
  app.keyframeLabel.innerHTML = window.getComputedStyle(app.ellipse).content;
  app.timelineRange.value = position;
  app.positionLabel.innerHTML = Math.round(position) + "%";
}

function loadHandler() {
  app.ellipse = document.getElementById("Ellipse_49").parentNode;
  app.stateLabel = document.getElementById("stateLabel");
  app.timeLabel = document.getElementById("timeLabel");
  app.keyframeLabel = document.getElementById("keyframeLabel");
  app.timelineRange = document.getElementById("timelineRange");
  app.positionLabel = document.getElementById("positionLabel");
  
  app.ellipse.addEventListener("animationiteration", animationListener);
  app.ellipse.addEventListener("animationend", animationListener);
  app.ellipse.addEventListener("animationstart", animationListener);
}

document.addEventListener("DOMContentLoaded", loadHandler);
var app = {};
* {
  font-family: sans-serif;
  font-size: 11px;
  letter-spacing: .6px;
}

@keyframes fadein {
  0% {
    opacity: 1;
    content: "show";
  }
  37.5% {
    /* 3 / 8 */
    opacity: 1;
    content: "fade out";
  }
  50% {
    /* (3 + 1) / 8 */
    opacity: 0.0;
    content: "wait";
  }
  87.5% {
    /* (3 + 1 + 3) / 8 */
    opacity: 0.0;
    content: "fade in";
  }
  100% {
    opacity: 1;
    content: "show";
  }
}

#Ellipse_49 {
  opacity: 1;
  fill: rgba(180, 180, 180, 1);
  stroke: rgb(112, 112, 112);
  stroke-width: 1px;
  stroke-linejoin: miter;
  stroke-linecap: butt;
  stroke-miterlimit: 4;
  shape-rendering: auto;
}

.Ellipse_49 {
  position: absolute;
  overflow: visible;
  width: 50px;
  height: 50px;
  left: 20px;
  top: 50px;
  
  /* remove alternate */
  animation: fadein 4s linear 0s infinite;
}

#container {
   top: 130px;
   left: 10px;
   position: relative;
   display: block;
}

label {
  width: 80px;
  display: inline-block;
}

input[type=range] {
  outline: 0px solid red;
  display: block;
  width: 90%;
  margin-left: 0;
}
input[type=range]::-webkit-slider-runnable-track {
  width: 100%;
  height: 8.4px;
  cursor: pointer;
  box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d;
  background: rgb(255,255,255);
}
<svg class="Ellipse_49">
		<ellipse id="Ellipse_49" rx="28" ry="28" cx="28" cy="28">
		</ellipse>
</svg>


<div id="container">
  <input id="timelineRange" type="range" value="0" min="0" max="100">
  <br>
  
  <label>time: </label>
  <span id="timeLabel"></span>
  <br>
  <label>position: </label>
  <span id="positionLabel"></span>
  <br>
  <label>state: </label>
  <span id="stateLabel"></span>
  <br>
  <label>key frame: </label>
  <span id="keyframeLabel"></span>
  <br>
  <br>
</div>

12
задан codeConcussion 17 February 2009 в 14:23
поделиться

3 ответа

WPF не включает удобную Систему. Windows. Формы. Экранный класс, но можно все еще использовать его свойства для выполнения задачи в приложении WinForms.

Предположите, что это означает окно WinForms, и _wpfWindow является определенной переменной, ссылающейся на Окно WPF в примере ниже (это было бы в любом обработчике кодов, который Вы устанавливаете для открытия WPF Window, как некоторая Кнопка. Нажмите обработчик):

Screen screen = Screen.FromControl(this);
_wpfWindow.StartupLocation = System.Windows.WindowStartupLocation.Manual;
_wpfWindow.Top = screen.Bounds.Top;
_wpfWindow.Left = screen.Bounds.Left;
_wpfWindow.Show();

Вышеупомянутый код инстанцирует Окна WPF в Верхнем левом углу экрана, содержащего Ваше Окно WinForms. Я оставлю математику Вам, если Вы хотите поместить ее в другое местоположение как середина экрана или в "каскадном" стиле ниже и направо от Вашего Окна WinForms.

Другой метод, который получает Окно WPF посреди экрана, должен был бы просто использовать

_wpfWIndow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen

Однако это не вполне как гибкое, потому что это использует положение мыши для выяснения, какой экран отобразить Окно WPF (и очевидно мышь могла быть на другом экране как приложение WinForms, если пользователь перемещает его быстро, или Вы используете кнопку по умолчанию, или безотносительно).

Править: Вот ссылка на документ SDK об использовании InterOp для центрирования Окна WPF по non-WPF Окну. Это делает в основном, что я описывал с точки зрения выяснения математики, но правильно позволяю Вам устанавливать свойство "Owner" Окна WPF с помощью HWND Окна.

14
ответ дан 2 December 2019 в 06:27
поделиться

Вот самый простой путь (использует WindowStartupLocation. CenterOwner).

MyDialogWindow dialogWindow = new MyDialogWindow();
dialogWindow.Owner = this;
dialogWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;

dialogWindow.ShowDialog();

Никакая потребность в interop или проводах окна установки :)

6
ответ дан 2 December 2019 в 06:27
поделиться

Необходимо смочь использовать Систему. Windows. Формы. Экран [1] и использование метод FromControl для получения информации об экране для формы. Можно затем использовать это для расположения окна WPF (вершина, оставленная) на основе экрана, на котором Вы пытаетесь определить местоположение его.

[1] Можно также использовать win32 MonitorFromRect и др., если Вы не делаете для загрузки WinForms dlls. Однако, так как Вы уже получили winforms API, Вы не собираетесь платить любой хит памяти/перфекта.

1
ответ дан 2 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: