我有一个WPF应用程序,正在尝试正确定位元素。只有四个元素,所以应该很简单,但我就是无法使其正常工作。
其中一个棘手的问题是当窗口出现时,它会自行调整大小到(大约)桌面窗口的大小,因此它没有固定的大小。
这些元素应该从上到下堆叠,所以Stack Panel似乎很自然。但是第三个元素必须占据前两个和最后一个元素未占据空间的所有剩余空间。无论我尝试什么,它都会占用太多或太少的空间。唯一看起来能工作的方法是给它一个具体的像素大小,但正如上面所述,这不起作用。
我最近尝试的是Dock Panel。虽然在Visual Studio设计器中看起来正确,但执行时,第三个元素-Canvas-完全覆盖了底部元素。
我的XAML:
<DockPanel>
<Button x:Name="btnClose" DockPanel.Dock="Top" Content="X"
HorizontalAlignment="Right" Margin="0,5,5,0" VerticalAlignment="Top"
Width="Auto" Height="Auto" Background="Black"
Foreground="White" Click="btnClose_Click"/>
<Label x:Name="lblTitle" DockPanel.Dock="Top" Content="My Title"
HorizontalAlignment="Center" VerticalAlignment="Top" Width="Auto"
Foreground="White" FontWeight="Bold" FontSize="22"/>
<Label x:Name="lblControls" DockPanel.Dock="Bottom" Content="Placeholder"
HorizontalAlignment="Center" VerticalAlignment="Bottom" Width="Auto"
Height="Auto" Foreground="White" FontWeight="Bold" FontSize="22"/>
<Border x:Name="CanvasBorder" BorderBrush="White" BorderThickness="5" >
<Canvas x:Name="cvsChart" Grid.Row="0" HorizontalAlignment="Stretch"
VerticalAlignment="Top" Width="Auto">
</Canvas>
</Border>
</DockPanel>
有没有办法让该画布延伸并填充其他三个不占用的空间?
更新 由于@Peter Duniho向我证明了代码的有效性,我尝试了一个实验并删除了窗口出现时我已经放置的调整大小代码。将其删除后,窗口会绝对正确地显示。这是我将其调整为(大多数情况下)桌面大小的方法:
public const int WINDOW_OFFSET = 10;
...
int screenWidth = (int)System.Windows.SystemParameters.PrimaryScreenWidth;
int screenHeight = (int)System.Windows.SystemParameters.PrimaryScreenHeight;
// center this window in desktop
Width = screenWidth - WINDOW_OFFSET;
Height = screenHeight - WINDOW_OFFSET;
Left = WINDOW_OFFSET/2;
Top = WINDOW_OFFSET/2;
我进行了一些搜索,发现在“Stack Overflow”上有一个评论建议获取WorkArea而不是PrimaryScreenHeight。我尝试了一下,哇! 整个应用程序窗口都出现了。
int screenWidth = (int)System.Windows.SystemParameters.WorkArea.Width;
int screenHeight = (int)System.Windows.SystemParameters.WorkArea.Height;
事实证明,底部行已经被显示了,只是因为它出现在屏幕的底部以下,所以我看不到。现在我能看到它了,回到了开发天堂!感谢大家的帮助!
lblControls
设置为顶部时,它们出现在顶部,位于Border和Canvas的上方,因为它们被告知要这样做,而不是它们应该这样做。Grid的方法也不起作用。我将所有行的高度都设为“自动”,除了Border和Canvas,它们的高度为“*”。它也隐藏了底部的标签。 - FrecklefootlblControls
放置在底部,而CanvasBorder
与其中的cvsChart
在lblTitle
和lblControls
之间。我可以编辑Grid
示例以符合您的评论,但最终不清楚为什么您在问题中提供的代码不能达到您想要的效果。根据您在此处的评论,它似乎已经做到了。 - Peter Duniho