【问题标题】:WPF ColumnDefinition Auto Width MinWidth BindingWPF ColumnDefinition 自动宽度 MinWidth 绑定
【发布时间】:2018-03-27 11:56:46
【问题描述】:

在我写这篇文章时,我找到了一个解决方案,我将在下面解释,但为了学术练习,我想知道为什么我的原始解决方案不起作用。

我试图设置一个 3 列 <Grid> ,其中左侧和右侧列将自动调整到其内容的大小,但宽度相同,因此较小的列会扩展以匹配较大的列。这是我尝试过的,看起来应该可以:

        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Name="FlagColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=NumberColumn}"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Name="NumberColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=FlagColumn}"/>
            </Grid.ColumnDefinitions>                

            <TextBlock Grid.Column="0" Text="AAAA" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Grid.Column="1" Text="BBBBBBBBBBBBB" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Grid.Column="2" Text="CCCCCCC" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Grid>

这导致列自动调整大小,但似乎忽略了 MinWidth 绑定,只是独立地自动调整大小以适应自己的内容。

仅供参考,这就是我最终为使其工作所做的工作:

        <Grid Grid.IsSharedSizeScope="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" SharedSizeGroup="Corner"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto" SharedSizeGroup="Corner"/>
            </Grid.ColumnDefinitions>                

            <TextBlock Grid.Column="0" Text="AAAA" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Grid.Column="1" Text="BBBBBBBBBBBBB" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <TextBlock Grid.Column="2" Text="CCCCCCC" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Grid>

【问题讨论】:

  • 第一个解决方案也适用于我..

标签: .net wpf binding


【解决方案1】:

您的第一个解决方案确实通过初始化(一次)起作用。

稍后不会更新宽度(如果您更改 TextBlocks 中的文本),因为 ActualWidthColumnDefinition 既没有 DependencyProperty 也没有通知更改(您可以在后面的代码中更新绑定,但这个解决方案很难看)。

所以如果你绑定到ActualWidthTextBlock,那么你的宽度将会被调整:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Name="FlagColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=tb3}"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Name="NumberColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=tb1}"/>
    </Grid.ColumnDefinitions>

    <TextBlock x:Name="tb1"  Grid.Column="0" Text="AAAA" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <TextBlock Grid.Column="1" Text="BBBBBBBBBBBBB" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <TextBlock x:Name="tb3" Grid.Column="2" Text="CCCCCCC" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>

此外,尽管Auto-size 小于MinWidth 从以前的值设置,但如果列中的文本更短,您的侧列不会缩小,因此新的宽度只会增加。

【讨论】:

  • 啊,谢谢,没有意识到它不是依赖属性。傻我。
  • 在我的情况下它不起作用,因为加载时列的宽度为 0,并且在某些绑定得到解决时会更新,因此从未看到更新的 ActualWidth。
【解决方案2】:

您的第一种方法效果很好。像这样测试并工作:

<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Name="FlagColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=NumberColumn}"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Name="NumberColumn" Width="Auto" MinWidth="{Binding ActualWidth, ElementName=FlagColumn}"/>
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Column="0" Text="AAAA" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <TextBlock Grid.Column="1" Text="BBBBBBBBBBBBB" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <TextBlock Grid.Column="2" Text="CCCCCCCCCCCCCCCCC" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>

第一列和第三列为 126.31,中间列为 531.38

【讨论】:

  • 另一个答案得到了它 - 因为ColumnDefinition.ActualWidth 不是一个依赖属性,当它的值改变时它没有更新绑定。
猜你喜欢
  • 2013-03-22
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 2011-01-21
  • 2011-08-17
  • 2012-09-13
  • 1970-01-01
相关资源
最近更新 更多