【发布时间】:2017-09-18 09:23:40
【问题描述】:
我创建了一些窗口,禁用了边框并设置了 SizeToContent="Height"。
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>
当我打开这个窗口时,我把它放在屏幕右下角:
private void setposition()
{
var primaryMonitorArea = SystemParameters.WorkArea;
this.Left = primaryMonitorArea.Right - this.Width;
this.Top = primaryMonitorArea.Bottom - this.Height;
}
有时我尝试将子级添加到 maingrid,然后重新定位它,因为高度已更改:
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;
之后,窗口位置在垂直平面中随机定位。 5 秒后,我破坏了它的边框并尝试重新定位窗口
private void timertick(Border brd, System.Windows.Forms.Timer timer)
{
maingrid.Children.Remove(brd);
timer.Enabled = false;
setposition();
timer.Dispose();
}
垂直位置又有一些奇怪的值。
屏幕位置:
【问题讨论】:
-
在 WPF 中,您必须等待渲染或强制布局(通过自己调用 measure/arrange),然后才能使用新尺寸。顺便说一句,使用
DispatcherTimer。 -
窗口渲染后如何等待?
-
我不确定到底是什么问题(到底出了什么问题?),这是我的疯狂评论。但如果这是正确的猜测,那么只需
Dispatcher.Invoke(() => methodToRunAfterRender, DispatcherPriority.Render)就可以了。