【问题标题】:ListView Column Size to Change with ContentListView 列大小随内容而变化
【发布时间】:2021-03-19 18:57:36
【问题描述】:

我有一个ListView,其中一些列包含TextBox 控件供用户输入文本。但是,如果输入的文本太长,则会受到当前列宽的限制。当输入的文本超出列的当前大小时,有没有办法自动调整列的宽度?

<ListView x:Name="List1" 
            Grid.Column="1" 
            Margin="0 0 5 20" 
            Background="Transparent" 
            Foreground="White" 
            BorderThickness="0"
            HorizontalAlignment="Stretch"
            HorizontalContentAlignment="Stretch"
            ScrollViewer.VerticalScrollBarVisibility="Auto" 
            ScrollViewer.HorizontalScrollBarVisibility="Auto"
            ItemsSource="{Binding Path=Stations}">


    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource {x:Type ListViewItem}}">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ListView.ItemContainerStyle>

    <ListView.View>
                                
        <GridView  AllowsColumnReorder="False">
                                    
            <!-- Location -->
            <GridViewColumn Header="Location">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox>
                            <TextBox.Style>
                                <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
                                <Setter Property="Text" Value="{Binding Location, Mode=TwoWay}"/>
                                <Setter Property="Width" Value="Auto"/>
                                <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=Text}"/>
                                </Style>
                            </TextBox.Style>
                        </TextBox>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>

【问题讨论】:

  • 我建议你用一个更简单的例子来分解你的问题,我们可以自己复制和尝试。现在我觉得你的列表视图样式可能与宽度交互

标签: c# wpf xaml listview


【解决方案1】:

您可以尝试处理TextChanged 事件并测量TextBox 的所需大小:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    TextBox textBox = (TextBox)sender;
    textBox.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
    if (textBox.DesiredSize.Width > col.Width)
        col.Width = textBox.DesiredSize.Width;
}

XAML:

<GridViewColumn Width="100" x:Name="col">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBox TextChanged="TextBox_TextChanged">
                <TextBox.Style>
                    <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
                        <Setter Property="Text" Value="{Binding Location, Mode=TwoWay}"/>
                        <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=Text}"/>
                    </Style>
                </TextBox.Style>
            </TextBox>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

【讨论】:

  • 这打破了 MVVM 模式(但确实有效)
  • 该问题未标记为 MVVM。此外,这是纯粹的视图/控制相关功能,如果它让您感觉更好,您可以将其包装在附加的行为中。它当然不应该在视图模型中实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 2017-11-23
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多