【问题标题】:uwp TextBlock height problem in a single lineuwp TextBlock 单行高度问题
【发布时间】:2019-12-26 02:30:26
【问题描述】:

我在 uwp 应用程序中有一种类似聊天的功能,有些聊天消息可以有很长的文本,因此它们会是多行的,有些会有小文本因此是单行的。

我遇到的问题是带有单行的文本块有底部有多余的空间,可能是因为文本块额外的不必要高度,同时多行文本块具有相同的其上方和下方的边距(如下图所示)。我也想要单行文本块的统一边距。

在下图中,仔细观察多行文本的底部空间较小,而单行文本的底部空间较大。

我尝试通过将 ListViewItemsVerticalContentAlignment 设置为 Top 来解决此问题,但尽可能产生了垂直边距问题如下图所示,项目之间的垂直边距不一致:

下面是相关代码。

主页

<Page
x:Class="ChatMarginBug.MainPage"
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:local="using:ChatMarginBug"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
mc:Ignorable="d">

<Page.Resources>
    <Style x:Key="ChatListViewStyle" TargetType="ListView">
        <Setter Property="HorizontalAlignment" Value="Stretch" />
        <Setter Property="SelectionMode" Value="None" />
        <Setter Property="ItemContainerStyle">
            <Setter.Value>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                    <Setter Property="VerticalContentAlignment" Value="Top" />
                    <Setter Property="HorizontalAlignment" Value="Stretch" />
                    <Setter Property="Margin" Value="12,2,12,2" />
                </Style>
            </Setter.Value>
        </Setter>
    </Style>
</Page.Resources>

<Grid>

    <ListView ItemsSource="{x:Bind MyTweets}" Style="{StaticResource ChatListViewStyle}">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="local:TweetData">
                <Grid HorizontalAlignment="{x:Bind MyTweetType, Converter={StaticResource TweetTypeToHAConverter1}}" x:DefaultBindMode="OneWay">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="{x:Bind MyTweetType, Converter={StaticResource TweetTypeToC1DefConverter1}}" />
                        <ColumnDefinition Width="{x:Bind MyTweetType, Converter={StaticResource TweetTypeToC2DefConverter1}}" />
                    </Grid.ColumnDefinitions>
                    <Grid Grid.Column="{x:Bind MyTweetType, Converter={StaticResource TweetTypeToMetaDataColumnConverter1}}">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <TextBlock
                            Margin="0,0,0,4"
                            HorizontalAlignment="Center"
                            FontSize="{StaticResource TinyFontSize}"
                            FontWeight="Bold"
                            Foreground="{ThemeResource ApplicationSecondaryForegroundThemeBrush}"
                            Text="Name" />
                        <TextBlock
                            Grid.Row="1"
                            HorizontalAlignment="Center"
                            FontSize="{StaticResource TinyFontSize}"
                            Foreground="{ThemeResource ApplicationSecondaryForegroundThemeBrush}"
                            Text="15:00" />
                    </Grid>
                    <Grid
                        Grid.Column="{x:Bind MyTweetType, Converter={StaticResource TweetTypeToMsgColumnConverter1}}"
                        MinWidth="120"
                        Background="{x:Bind MyTweetType, Converter={StaticResource TweetTypeToColorConverter1}}">
                        <TextBlock
                            Margin="16,8,16,8"
                            FontSize="{StaticResource SmallFontSize}"
                            FontWeight="Normal"
                            Text="{x:Bind Text}"
                            TextTrimming="CharacterEllipsis"
                            TextWrapping="WrapWholeWords" />
                    </Grid>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>
</Page>

MainPage.xaml.cs

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        InitializeComponent();
        MyTweets = new List<TweetData>
        {
            new TweetData{ Text="abqrwfsddggc", MyTweetType = TweetType.Mine},
            new TweetData{ Text="abqrwfsddggasasasc", MyTweetType = TweetType.Mine},
            new TweetData{ Text="abqrwfsddassqsasacbvretgergggc", MyTweetType = TweetType.Mine},
            new TweetData{ Text="abcalkdjdjjd qdjqwpodwqpodqwjdqwkj qdkjqwkdjqwlkdjqlkdjaslkj   qieoqieowqdjwkjwkj kdwqjqwlk;lqwkd;lkd;laskd;laks;dlkaskld;lakdpoiwdpowqkd;l qwioeqwijdkqwjdlkndlksanlcsmcsa qwkkjeqwjdlkqwjdlksadmasldjl;qkd;asljdlqwkhdlwqk", MyTweetType = TweetType.Mine},
            new TweetData{ Text="abcalkdjkjwkj kdwqjqwlk;lqwkd;lkd;laskd;laks;dlkaskld;lakdpoiwdpowqkd;l qwioeqwijdkqwjdlkndlksanlcsmcsa qwkkjeqwjdlkqwjdlksadmasldjl;qkd;asljdlqwkhdlwqk", MyTweetType = TweetType.Mine},
            new TweetData{ Text="abewqeqweqweqwe", MyTweetType = TweetType.Mine},
            new TweetData{ Text="abcalkdjdjjd qdjqwpodwqpodqwjdqwkj qdkjqwkdjqwlkdjqlkdjaslkj   qieoqieowqdjwkjwkj kdwqjqwlk;lqwkd;lkd;laskd;laks;dlkaskld;lakdpoiwdpowqkd;l qwioeqwijdkqwjdlkndlksanlcsmcsa qwkkjeqwjdlkqwjdlksadmasldjl;qkd;asljdlqwkhdlwqk", MyTweetType = TweetType.Mine},
            new TweetData{ Text="abcalkdjdjjd qdjqwpodwqpodqwjdqwkj qdkjqwkdjqwlkdjqlkdjaslkj   qieoqieowqdjwkjwkj kdwqjqwlk;lqwkd;lkd;laskd;laks;dlkaskld;lakdpoiwdpowqkd;l qwioeqwijdkqwjdlkndlksanlcsmcsa qwkkjeqwjdlkqwjdlksadmasldjl;qkd;asljdlqwkhdlwqk", MyTweetType = TweetType.NotMine},
            new TweetData{ Text="abc", MyTweetType = TweetType.NotMine},
            new TweetData{ Text="abcqdwqdqdqsdqwdwqdsdsaddz", MyTweetType = TweetType.Mine},
            new TweetData{ Text="abc", MyTweetType = TweetType.NotMine},
            new TweetData{ Text="abcscascqwdwwrewr", MyTweetType = TweetType.NotMine},
            new TweetData{ Text="abc", MyTweetType = TweetType.NotMine},
            new TweetData{ Text="abc", MyTweetType = TweetType.NotMine},
            new TweetData{ Text="abcqweqwewqeqweqdsdadqwqw", MyTweetType = TweetType.NotMine},
            new TweetData{ Text="xkwjdwqjdpo", MyTweetType = TweetType.NotMine}
        };
    }

    public List<TweetData> MyTweets { get; }
}

模型

public class TweetData
{
    public string Text { get; set; }
    public TweetType MyTweetType { get; set; }
}

public enum TweetType { Mine, NotMine }

请注意,所有 UI 转换器都用于水平对齐和颜色等,并且不会像您在上面的 xaml 中看到的那样混淆高度或垂直对齐。我为此准备了一个示例应用程序,您可以自己进行测试:

https://github.com/touseefbsb/ChatMarginBug

【问题讨论】:

    标签: c# xaml listview uwp textblock


    【解决方案1】:

    您可以设置 ListViewItem 的 MinHeight 以移除文本块底部剩余的多余空间:

    <Setter.Value>
                        <Style TargetType="ListViewItem">​
                            <Setter Property="HorizontalContentAlignment" Value="Stretch" />​
                            <Setter Property="VerticalContentAlignment" Value="Stretch" />​
                            <Setter Property="HorizontalAlignment" Value="Stretch" />​
                            <Setter Property="Margin" Value="12,2,12,2" />​
                            <Setter Property="MinHeight" Value="20"></Setter>​
                        </Style>​
    </Setter.Value>
    

    【讨论】:

      猜你喜欢
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 2011-01-18
      • 2013-02-04
      • 1970-01-01
      相关资源
      最近更新 更多