WPF ListView控件右边框切断

问题描述 投票:0回答:2

我试图创建3个文本行WPF列表视图,但右边框设置不正确(由围绕1-3像素right border切断。左手边是罚款。

<Window x:Class="ListViewBorder.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"
    xmlns:local="clr-namespace:ListViewBorder"
    mc:Ignorable="d"
    x:Name="MainWindowUc"
    Title="MainWindow" Height="800" Width="1024">
<Grid>
    <ListView
        ItemsSource="{Binding ElementName=MainWindowUc, Path=Items}"
        BorderBrush="DarkCyan"
        BorderThickness="1" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
        >
        <ListView.ItemTemplate>
            <DataTemplate>
                <Border Background="DarkGray"
                        BorderBrush="Blue" 
                        BorderThickness="2"
                        CornerRadius="6" 
                        ScrollViewer.VerticalScrollBarVisibility="Disabled"
                        Width="{Binding (FrameworkElement.ActualWidth), RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}">
                    <WrapPanel Width="{Binding (FrameworkElement.ActualWidth), RelativeSource={RelativeSource AncestorType=Border}}"
                               >

                        <TextBlock Padding="1" Text="{Binding Column1}" Width="{Binding (FrameworkElement.ActualWidth), RelativeSource={RelativeSource AncestorType=WrapPanel}}" TextWrapping="NoWrap"></TextBlock>
                        <TextBlock Padding="1" Text="{Binding Column2}" Width="{Binding (FrameworkElement.ActualWidth), RelativeSource={RelativeSource AncestorType=WrapPanel}}" TextWrapping="Wrap"></TextBlock>
                        <TextBlock Padding="1" Text="{Binding Column3}" Width="{Binding (FrameworkElement.ActualWidth), RelativeSource={RelativeSource AncestorType=WrapPanel}}" TextWrapping="Wrap" TextAlignment="Right"></TextBlock>

                    </WrapPanel>

                </Border>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

如何“修复”呢?

c# wpf listview listviewitem
2个回答
0
投票

您没有设置宽度明确任何地方,只需删除您的宽度绑定,试试这个:

<ListView BorderBrush="DarkCyan"
        BorderThickness="1"
        ItemsSource="{Binding ElementName=MainWindowUc, Path=Items}"
        HorizontalContentAlignment="Stretch"
        ScrollViewer.HorizontalScrollBarVisibility="Disabled"
        ScrollViewer.VerticalScrollBarVisibility="Disabled">
<ListView.ItemTemplate>
    <DataTemplate>
        <Border Background="DarkGray"
                BorderBrush="Blue"
                BorderThickness="2"
                CornerRadius="6"
                Padding="6"
                ScrollViewer.VerticalScrollBarVisibility="Disabled">
            <StackPanel>
                <TextBlock Padding="1"
                            Text="{Binding Column1}"
                            TextWrapping="NoWrap" />
                <TextBlock Padding="1"
                            Text="{Binding Column2}"
                            TextWrapping="Wrap" />
                <TextBlock Padding="1"
                            Text="{Binding Column3}"
                            TextAlignment="Right"
                            TextWrapping="Wrap" />

            </StackPanel>
        </Border>
    </DataTemplate>
</ListView.ItemTemplate>

关键是以下几点:HorizontalContentAlignment="Stretch"

这看起来是这样的:

Example Image


0
投票

万一别人有这个问题,并设置HorizontalContentAlignment="Stretch"没有帮助:

我唯一没做到这一点解决了这个问题对我来说是彻头彻尾的设置ListViewItem的宽度属性比ViewportWidth它在的ScrollViewer有点少。

<Window.Resources>
    <Style x:Key="MyStyle" TargetType="ListViewItem">
        <Setter Property="Width" Value="{Binding ViewportWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ScrollViewer}, Converter={StaticResource ABitLessConverter}}" />
        <Setter Property="BorderBrush" Value="LightGray" />
        <Setter Property="BorderThickness" Value="1" />
    </Style>
</Window.Resources>

然后在ListView

<ListView ItemContainerStyle="{StaticResource MyStyle}">
    <!-- Contents -->
</ListView>

下面是其中减去一个小的ABitLessConverter的代码:

class ABitLessConverter : IValueConverter
{
    private const int REDUCTION_VALUE = 2;

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double intValue = (double)value;
        return intValue > REDUCTION_VALUE ? intValue - REDUCTION_VALUE : value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

当然,对于{StaticResource ABitLessConverter}工作,你需要使它成为一个资源,其关键是"ABitLessConverter"地方。

© www.soinside.com 2019 - 2024. All rights reserved.