我有以下XAML代码:
<Grid Grid.Row="2" Name="grid_StatusBar">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="{Binding ElementName=wrapPanel, Path=ActualWidth}" />
<ColumnDefinition Width="30" />
</Grid.ColumnDefinitions>
<ProgressBar Grid.Column="0" HorizontalAlignment="Stretch" Margin="5,5,5,5" Name="progressBar1" VerticalAlignment="Stretch" />
<WrapPanel Grid.Column="1" Name="wrapPanel" HorizontalAlignment="Right">
<Label Content="1" Height="28" HorizontalAlignment="Right" Margin="0,0,0,0" Name="label_Dataset" VerticalAlignment="Stretch" Visibility="Collapsed" />
<Label Content="/20" Height="28" HorizontalAlignment="Right" Margin="0,0,0,0" Name="label_TotalDatasets" VerticalAlignment="Stretch" Visibility="Collapsed" />
<Label Content="ID:" Height="28" HorizontalAlignment="Right" Margin="0,0,0,0" Name="label_IDText" VerticalAlignment="Stretch" />
<Label Content="no id" Height="28" HorizontalAlignment="Right" Margin="0,0,0,0" Name="labelID" VerticalAlignment="Stretch" />
</WrapPanel>
<Button Grid.Column="2" Name="button_Help" Height="30" Width="30" Content="?" HorizontalAlignment="Right" VerticalAlignment="Stretch" Click="button_Help_Click" >
</Grid>
我试图显示尽可能宽的进度条,同时更改一些标签的可见性并设置不同的文本(因此也设置不同的长度/宽度)。
我有不同的功能:
- 在程序启动时,
labelID
标签的"无id"文本将替换为内部值宽度更新:确定 - 随着代码的运行,我更改了前两个标签的可见性,
ColumnDefinition.Width
不会更新,只显示前两个标记(因为没有足够的位置容纳所有4个标签):错误! - 如果我将前两个标签的
Visibility
属性从Collapsed
更改为Visible
,则从一开始,所有标签的可见性都是Visible
,并且所有标签都显示为:确定 - 从以前的状态,我将前两个标签的可见性更改为
Collapsed
,ColumnDefinition.Width
将更新,ProgressBar
将尽可能宽,并且所有文本都显示为:OK
有人能帮我吗?我不明白为什么宽度没有更新。。。
注意:使用窗口中运行以下代码的两个按钮更改可见性:
label_Dataset.Visibility = System.Windows.Visibility.Visible;
label_TotalDatasets.Visibility = System.Windows.Visibility.Visible;
编辑:我的目标是使用最小的空间(在一行中)显示可见标签,以便使ProgressBar使用尽可能大的宽度。
不能根据子元素的宽度来更改父元素的宽度。在您的情况下,该列是WrapPanel
的父列,因此WrapPanel
的ActualWidth
在调整网格/列的大小之后才可用。
即使您编写代码试图绕过这一点,您仍然会遇到问题,因为度量/布局序列将重新进入。每当列的大小发生变化时,它都会重新布局所有子控件,其中一个子控件是WrapPanel
。这将导致WrapPanel
的ActualWidth
发生变化,从而有效地导致无限循环。为了防止这种堆栈溢出情况,框架会立即检测布局/度量周期中的任何重新进入,并抛出异常。
我不太确定你想达到什么目的。为什么要在WrapPanel
中使用标签?当然,你总是希望这4个标签在同一行上,或者至少在两行上。
如果是这种情况,我会将第二列的宽度设置为"自动",并将标签放在另一个容器中,即以下容器之一:
-
如果您希望所有标签都被包裹起来,就像
WrapPanel
被强制到其最小宽度一样,请使用:<StackPanel Grid.Column="1" Orientation="Vertical"> ... your labels here ... </StackPanel>
-
如果您希望所有标签保持在同一行,请使用:
<StackPanel Grid.Column="1" Orientation="Horizontal"> ... your labels here ... </StackPanel>
-
如果您想要两条线路,请使用:
<StackPanel Grid.Column="1" Orientation="Vertical"> <StackPanel Orientation="Horizontal"> ... 1st 2 labels here ... </StackPanel> <StackPanel Orientation="Horizontal"> ... 2nd 2 labels here ... </StackPanel> </StackPanel>