首页 文章

wpf - 绑定问题ActualWidth

提问于
浏览
0

我有以下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 标签的"no id"文本将替换为内部值 . 宽度已更新: OK

  • 运行代码后,我更改了前两个标签的可见性,并且 ColumnDefinition.Width 未更新,只显示前两个标签(因为没有足够的空间让所有4个标签适合wrapPanel ActualWidth: ERROR!

  • 如果我将 Visibility 属性从 Collapsed 的前两个标签更改为 Visible ,则从开始,所有标签的可见性为 Visible ,并显示所有标签: OK

  • 从上一个状态我将前两个标签的可见性更改为 CollapsedColumnDefinition.Width 更新, ProgressBar 尽可能宽,并显示所有文本: OK

有人可以帮帮我吗?我不明白为什么宽度没有更新...

NOTE: 使用运行以下代码的窗口中的两个按钮更改可见性:

label_Dataset.Visibility = System.Windows.Visibility.Visible;
label_TotalDatasets.Visibility = System.Windows.Visibility.Visible;

EDIT: 我的目标是使用最小空间(在一行中)显示可见标签,以使ProgressBar尽可能使用最大宽度 .

1 回答

  • 1

    无法根据子项的宽度更改父元素的宽度 . 在您的情况下,该列是 WrapPanel 的父级,因此 WrapPanelActualWidth 在网格/列已经调整大小之后才可用 .

    即使您编写代码来尝试并绕过这一点,您仍然会遇到问题,因为度量/布局序列将变得可重入 . 只要列的大小发生更改,它就会重新布局所有子控件,其中一个是 WrapPanel . 这将导致 WrapPanelActualWidth 被更改 - 有效地导致无限循环 . 为防止此堆栈溢出情况,框架会立即检测布局/度量周期中的任何重入并引发异常 .

    我不确定你想要达到的目标 . 为什么你想要 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>
    

相关问题