Ich habe ein Fenster erstellt, deaktivierten Rahmen und setze SizeToContent = "Height".Automatisches Positionsfenster - WPF
XAML:
<Window Title="info" Width="350" ResizeMode="NoResize" WindowStyle="None" Opacity="1" Background="{x:Null}" AllowsTransparency="True" SizeToContent="Height">
<Grid>
<StackPanel Name="maingrid" Background="AliceBlue">
</StackPanel>
</Grid>
</Window>
Wenn ich das Fenster öffne ich es in der rechten unteren Bildschirm positionieren:
private void setposition()
{
var primaryMonitorArea = SystemParameters.WorkArea;
this.Left = primaryMonitorArea.Right - this.Width;
this.Top = primaryMonitorArea.Bottom - this.Height;
}
Manchmal versuche ich, Kinder zu Maingrid, hinzuzufügen und setzen Sie sie wieder, weil Höhe wurde geändert:
Border brd = new Border();
DockPanel.SetDock(brd, Dock.Top);
brd.Margin =new System.Windows.Thickness(0,5,0,0);
DockPanel dpanel = new DockPanel();
System.Windows.Controls.Label header = new System.Windows.Controls.Label();
header.Content = "test";
DockPanel.SetDock(header, Dock.Top);
dpanel.Children.Add(header);
brd.Child = dpanel;
maingrid.Children.Add(brd);
setposition();
System.Windows.Forms.Timer tmer = new System.Windows.Forms.Timer();
tmer.Tick += (sender, e) => timertick(brd, tmer);
tmer.Interval = 5 * 1000;
tmer.Enabled = true;
A nachdem die Fensterposition zufällig in der vertikalen Ebene positioniert ist. Nach 5 Sekunden zerstörte ich seine Grenze und versuchte, das Fenster neu zu positionieren
private void timertick(Border brd, System.Windows.Forms.Timer timer)
{
maingrid.Children.Remove(brd);
timer.Enabled = false;
setposition();
timer.Dispose();
}
und wieder vertikale Position hat einige seltsame Wert.
Position auf dem Bildschirm:
In WPF müssen Sie entweder auf das Rendern warten oder das Layout erzwingen (indem Sie measure/arrangement aufrufen), bevor neue Größen verfügbar sind. Übrigens, benutze 'DispatcherTimer'. – Sinatr
Wie kann ich warten, wenn Fenster gerendert hat? – Vozdr
Ich bin mir nicht sicher, was genau das Problem ist (was genau ist falsch?), Es war mein verrückter Kommentar. Aber wenn das richtig ist, dann genügt 'Dispatcher.Invoke (() => methodToRunAfterRender, DispatcherPriority.Render)'. – Sinatr