2013-03-21 2 views
0

Я делаю свою программу многопоточной, потому что это менеджер сервера для Bukkit (Minecraft), который довольно тяжелый для некоторых систем. Теперь я столкнулся с небольшой проблемой. Когда я хочу открыть новую дочернюю форму, я не могу сказать ее центру. Он просто не делает то, что я говорю, чтобы форма делала. Я нашел обходное решение для этого, но я не знаю, можно ли сделать это проще или мне нужно что-то изменить.Как открыть дочернюю форму с центром над родителем?

Это код, у меня есть атм:
Работы

private void ThreadFrmSettings() 
{ 
    Form frmSettings = new frmSettings(); 
    frmSettings.StartPosition = FormStartPosition.Manual; 
    frmSettings.Location = new Point(Location.X + (Width - frmSettings.Width)/2, Location.Y + (Height - frmSettings.Height)/2); 
    frmSettings.ShowDialog(); 
} 

не работает

var frmSettings = new frmSettings(); 
frmSettings.ShowDialog(); 

Является ли это поведение нормально? Благодаря!

+0

Что относительно 'StartPosition = FormStartPosition.CenterScreen;' свойство 'From'? –

+2

Как насчет многопоточности беспокоит вас особенно? Поведение по умолчанию для «ShowDialogue» не является «центральным», независимо от того, есть ли у вас несколько потоков. – IdeaHat

+0

@MadScienceDreams Когда я удаляю многопоточность, код отлично работает: /. –

ответ

0

Что относительно StartPosition = FormStartPosition.CenterScreen; собственность From?

I.e.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     StartPosition = FormStartPosition.CenterScreen; 

     Form frmSettings = new Form(); 
     frmSettings.Width = 300; 
     frmSettings.Height = 200; 
     frmSettings.StartPosition = FormStartPosition.CenterScreen; 
     //frmSettings.Location = new Point(Location.X + (Width - frmSettings.Width)/2, Location.Y + (Height - frmSettings.Height)/2); 
     frmSettings.ShowDialog(); 

    } 
} 

Примечание: frmSettings.Show(); дает другой результат и в этом случае окно не будет в центре.

Вот пример ниткой/задачи

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      StartPosition = FormStartPosition.CenterScreen; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Task.Factory.StartNew(() => { 

       Form frmSettings = new Form(); 
       frmSettings.Width = 300; 
       frmSettings.Height = 200; 
       frmSettings.StartPosition = FormStartPosition.CenterParent; 

       frmSettings.ShowDialog(); 

      }); 

     } 
    } 

enter image description here

+0

Кажется, что не работает :( –

+0

@FoxyShadoww Посмотрите обновленный код. –

+0

Это работает, но он не будет помещать форму в центр родителя: p. Atleast, не для меня. –

0

Я последовал совету MadScienceDreams и получил результат я хотел, это код, который сделал трюк:

this.Invoke(new MethodInvoker(()=>ThreadFrmSettings()) 
+0

'MethodInvoker' из [Microsoft.JScript] (http://msdn.microsoft.com/en-us/library/microsoft.jscript.methodinvoker.aspx)? На этой странице говорится: «Этот API поддерживает инфраструктуру .NET Framework и не предназначен для непосредственного использования из вашего кода». –

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