2016-09-27 2 views
3

У меня есть код ниже, чтобы нарисовать кнопку (кнопки) на панели для каждого монитора, который в настоящее время подключен к ПК.Кнопки заказа, которые представляют подключенные мониторы по Windows. Порядок отображения

var padding = 5; 
var buttonSize = new Size(95, 75); 
for (int i = 0; i < Screen.AllScreens.Length; i++) 
{ 
    var screen = Screen.AllScreens[i]; 
    Button monitor = new Button 
    { 
     Name = "Monitor" + screen, 
     AutoSize = true, 
     Size = buttonSize, 
     Location = new Point(12 + i * (buttonSize.Width + padding), 14), 
     BackgroundImageLayout = ImageLayout.Stretch, 
     BackgroundImage = Properties.Resources.display_enabled, 
     TextAlign = ContentAlignment.MiddleCenter, 
     Font = new Font("Segoe UI", 10, FontStyle.Bold), 
     ForeColor = Color.White, 
     BackColor = Color.Transparent, 
     Text = screen.Bounds.Width + "x" + screen.Bounds.Height 
    }; 

    monitorPanel.Controls.Add(monitor); 
} 

Для устройств с одним или несколькими мониторами, подключенными, код работает просто отлично, и это конечный результат:

enter image description here

Однако, в то время как он работает, я хотел бы (если возможно) заказать их, как они появляются в окне дисплея с Windows:

enter image description here

в первом скриншоте, они заказывается как 2 | 3 | 1 вместо 3 | 2 | 1.

Является ли это возможным после меня?

+3

В последнее время, в подобной ситуации, я заказал возвращенный 'Screen's в коллекции с помощью позиции начала Х границ каждого монитора (в мой случай, каждый монитор начинался с более высокой координаты X, я не знаю, универсально ли это). –

+0

Вы можете использовать 'dmPosition'. [ссылаться на эту ссылку] (https://msdn.microsoft.com/en-us/library/dd183411 (v = vs.85) .aspx) – Keppy

ответ

1

Несколько экранов в Windows обрабатываются как одна, большая, «склеенная» рабочая зона. Исходя из этого, порядок экранов в конфигурации зависит от их положения в новой рабочей области. Если предположить, что все ваши экраны в одной строке, вы можете просто использовать

screen.Bounds.X

заказав недвижимость. Если экраны выкладываются в несколько строк, то при заказе также необходимо будет рассмотреть компонент Y.

EDIT: Вы можете использовать Linq для сортировки, в частности OrderBy(). Пример использования для случая, когда экраны находятся в одной строке, и коллекция будет повторяться один раз.

Изменить

for (int i = 0; i < Screen.AllScreens.Length; i++) 
{ 
    var screen = Screen.AllScreens[i]; 

в

foreach(var screen in Screen.AllScreens.OrderBy(i => i.Bounds.X)) 
{ 
+0

В чем отличие вашего ответа от моего комментария выше? –

+4

@UweKeim, во-первых, я объяснил, почему это работает. Во-вторых: «Используйте комментарии, чтобы запросить дополнительную информацию или предложить улучшения. Избегайте ответов на вопросы в комментариях». – kiziu

+0

Спасибо за ответ. Я не думаю, что вы могли бы подробнее рассказать о том, как использовать свойство ordering в моем примере? Я до сих пор довольно новичок в кодировании, и мне не очень повезло, чтобы заказать мониторы. – Rawns

Смежные вопросы