在 WindowsFormsHost 面板内排列控件 - wpf
Arranging controls inside a panel of WindowsFormHost - wpf
我在面板中有三个控件,如下所示。我必须在面板中央安排一个。另外两个应该放在中间一个的左右两侧。
我试过如下。但是让所有三个控件都左对齐。请帮忙指正
<WindowsFormsHost x:Name="windowsFormsHost1" Grid.Row="5" Grid.ColumnSpan="3" Initialized="WindowsFormsHost_Initialized" HorizontalAlignment="Center" VerticalAlignment="Center" >
<wf:Panel x:Name="Panel_glcontrol" Dock="None" BackColor="yellow" >
<wf:Panel.Controls>
<opentk:GLControl x:Name="glControl" Width="450" Height="299" Dock="None" Visible="True" MouseMove="GlControl_MouseMove" MouseDown="GlControl_MouseDown" Resize="glControl_Resize" Paint="glControl_Paint" />
<opentk:GLControl x:Name="glControl2" Width="450" Height="299" Dock="None" MouseDown="GlControl2_MouseDown" MouseMove="GlControl2_MouseMove" Visible="True" Resize="glControl2_Resize" Paint="glControl2_Paint" />
<opentk:GLControl x:Name="glControl3" Width="450" Dock="None" Height="299" Visible="True" MouseDown="GlControl3_MouseDown" MouseMove="GlControl3_MouseMove" Resize="glControl3_Resize" Paint="glControl3_Paint" />
</wf:Panel.Controls>
</wf:Panel>
</WindowsFormsHost>
glControl2.Location = new System.Drawing.Point((_Screenwidth / 2) - glControl2.Width / 2, (_Screenheight - glControl.Height) / 2);
glControl.Location = new System.Drawing.Point(glControl2.Location.X - glControl.Width - 5, (_Screenheight - glControl2.Height) / 2 );
glControl3.Location = new System.Drawing.Point(glControl2.Location.X + glControl2.Width + 5, (_Screenheight - glControl3.Height) / 2 );
如果将每个 WinForms 控件放在其自己的宿主中,然后使用 WPF 面板进行布局,会怎样?像这样:
<UniformGrid Rows="1" Grid.Row="5" Grid.ColumnSpan="3" HorizontalAlignment="Center" VerticalAlignment="Center" Background="Yellow">
<WindowsFormsHost>
<opentk:GLControl x:Name="glControl" Width="450" Height="299" Dock="None" Visible="True" MouseMove="GlControl_MouseMove" MouseDown="GlControl_MouseDown" Resize="glControl_Resize" Paint="glControl_Paint"/>
</WindowsFormsHost>
<WindowsFormsHost>
<opentk:GLControl x:Name="glControl2" Width="450" Height="299" Dock="None" MouseDown="GlControl2_MouseDown" MouseMove="GlControl2_MouseMove" Visible="True" Resize="glControl2_Resize" Paint="glControl2_Paint"/>
</WindowsFormsHost>
<WindowsFormsHost>
<opentk:GLControl x:Name="glControl3" Width="450" Dock="None" Height="299" Visible="True" MouseDown="GlControl3_MouseDown" MouseMove="GlControl3_MouseMove" Resize="glControl3_Resize" Paint="glControl3_Paint"/>
</WindowsFormsHost>
</UniformGrid>
我已经通过删除 WindowsFormsHost 的水平和垂直对齐方式解决了这个问题。然后添加下面的函数来重新定位控件。
private void RelocateOpenGLs()
{
int PSBH = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
int TaskBarHeight = PSBH - System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;//have to hide taskbar
glControl2.Location = new System.Drawing.Point((_Screenwidth / 2) - glControl2.Width / 2, ((Panel_glcontrol.Height - glControl.Height) / 2) - TaskBarHeight);
glControl.Location = new System.Drawing.Point(glControl2.Location.X - glControl.Width - 2, ((Panel_glcontrol.Height - glControl2.Height) / 2) - TaskBarHeight);
glControl3.Location = new System.Drawing.Point(glControl2.Location.X + glControl2.Width + 2, ((Panel_glcontrol.Height - glControl3.Height) / 2) - TaskBarHeight);
}
我在面板中有三个控件,如下所示。我必须在面板中央安排一个。另外两个应该放在中间一个的左右两侧。 我试过如下。但是让所有三个控件都左对齐。请帮忙指正
<WindowsFormsHost x:Name="windowsFormsHost1" Grid.Row="5" Grid.ColumnSpan="3" Initialized="WindowsFormsHost_Initialized" HorizontalAlignment="Center" VerticalAlignment="Center" >
<wf:Panel x:Name="Panel_glcontrol" Dock="None" BackColor="yellow" >
<wf:Panel.Controls>
<opentk:GLControl x:Name="glControl" Width="450" Height="299" Dock="None" Visible="True" MouseMove="GlControl_MouseMove" MouseDown="GlControl_MouseDown" Resize="glControl_Resize" Paint="glControl_Paint" />
<opentk:GLControl x:Name="glControl2" Width="450" Height="299" Dock="None" MouseDown="GlControl2_MouseDown" MouseMove="GlControl2_MouseMove" Visible="True" Resize="glControl2_Resize" Paint="glControl2_Paint" />
<opentk:GLControl x:Name="glControl3" Width="450" Dock="None" Height="299" Visible="True" MouseDown="GlControl3_MouseDown" MouseMove="GlControl3_MouseMove" Resize="glControl3_Resize" Paint="glControl3_Paint" />
</wf:Panel.Controls>
</wf:Panel>
</WindowsFormsHost>
glControl2.Location = new System.Drawing.Point((_Screenwidth / 2) - glControl2.Width / 2, (_Screenheight - glControl.Height) / 2);
glControl.Location = new System.Drawing.Point(glControl2.Location.X - glControl.Width - 5, (_Screenheight - glControl2.Height) / 2 );
glControl3.Location = new System.Drawing.Point(glControl2.Location.X + glControl2.Width + 5, (_Screenheight - glControl3.Height) / 2 );
如果将每个 WinForms 控件放在其自己的宿主中,然后使用 WPF 面板进行布局,会怎样?像这样:
<UniformGrid Rows="1" Grid.Row="5" Grid.ColumnSpan="3" HorizontalAlignment="Center" VerticalAlignment="Center" Background="Yellow">
<WindowsFormsHost>
<opentk:GLControl x:Name="glControl" Width="450" Height="299" Dock="None" Visible="True" MouseMove="GlControl_MouseMove" MouseDown="GlControl_MouseDown" Resize="glControl_Resize" Paint="glControl_Paint"/>
</WindowsFormsHost>
<WindowsFormsHost>
<opentk:GLControl x:Name="glControl2" Width="450" Height="299" Dock="None" MouseDown="GlControl2_MouseDown" MouseMove="GlControl2_MouseMove" Visible="True" Resize="glControl2_Resize" Paint="glControl2_Paint"/>
</WindowsFormsHost>
<WindowsFormsHost>
<opentk:GLControl x:Name="glControl3" Width="450" Dock="None" Height="299" Visible="True" MouseDown="GlControl3_MouseDown" MouseMove="GlControl3_MouseMove" Resize="glControl3_Resize" Paint="glControl3_Paint"/>
</WindowsFormsHost>
</UniformGrid>
我已经通过删除 WindowsFormsHost 的水平和垂直对齐方式解决了这个问题。然后添加下面的函数来重新定位控件。
private void RelocateOpenGLs()
{
int PSBH = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;
int TaskBarHeight = PSBH - System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;//have to hide taskbar
glControl2.Location = new System.Drawing.Point((_Screenwidth / 2) - glControl2.Width / 2, ((Panel_glcontrol.Height - glControl.Height) / 2) - TaskBarHeight);
glControl.Location = new System.Drawing.Point(glControl2.Location.X - glControl.Width - 2, ((Panel_glcontrol.Height - glControl2.Height) / 2) - TaskBarHeight);
glControl3.Location = new System.Drawing.Point(glControl2.Location.X + glControl2.Width + 2, ((Panel_glcontrol.Height - glControl3.Height) / 2) - TaskBarHeight);
}