如何确保ListView显示完整的项目

时间:2018-07-26 07:49:05

标签: wpf listview scrollviewer

我一直在遵循准则和other SO posts关于如何完整显示ListView项的信息,但是它不能按预期工作。为了演示,我创建了这个非常简单的示例:

XAML:

<Window x:Class="WpfApp.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:WpfApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">

    <Window.Resources>
        <ResourceDictionary>
            <Style TargetType="ListView">
                <Setter Property="Height" Value="150"/>
                <Setter Property="Width" Value="50"/>
                <Setter Property="Background" Value="Transparent"/>
                <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled"/>
                <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
                <Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
            </Style>
            <Style TargetType="ListViewItem">
                <Setter Property="Height" Value="30"/>
                <Setter Property="Width" Value="50"/>
                <Setter Property="BorderThickness" Value="0"/>
                <Setter Property="VerticalAlignment" Value="Center"/>
                <Setter Property="HorizontalAlignment" Value="Center"/>
                <Setter Property="VerticalContentAlignment" Value="Center"/>
                <Setter Property="HorizontalContentAlignment" Value="Center"/>
            </Style>
            <Style TargetType="TextBox">
                <Setter Property="Height" Value="30"/>
                <Setter Property="Width" Value="50"/>
                <Setter Property="VerticalAlignment" Value="Center"/>
                <Setter Property="HorizontalAlignment" Value="Center"/>
                <Setter Property="VerticalContentAlignment" Value="Center"/>
                <Setter Property="HorizontalContentAlignment" Value="Center"/>
            </Style>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <TextBox PreviewMouseDown="textBox_PreviewMouseDown"  Text="5" />

        <Popup x:Name="popup"
               AllowsTransparency="True"
               PlacementTarget="{Binding ElementName=textBox}"
               Placement="Center"
               StaysOpen="False"
               >
            <ListView>
                <ListViewItem Content="5"/>
                <ListViewItem Content="5"/>
                <ListViewItem Content="5"/>
                <ListViewItem Content="5"/>
                <ListViewItem Content="5"/>
                <ListViewItem Content="5"/>
                <ListViewItem Content="5"/>
                <ListViewItem Content="5"/>
                <ListViewItem Content="5"/>
                <ListViewItem Content="5"/>
            </ListView>
        </Popup>
    </Grid>
</Window>

隐藏代码:

using System.Windows;
using System.Windows.Input;

namespace WpfApp
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void textBox_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            popup.IsOpen = true;
        }
    }
}

此应用程序启动时显示如下所示的文本框:

TextBox

当我单击TextBox时,弹出窗口打开并显示具有5个可见项的ListView:

enter image description here

现在您可以看到,中间的项目不能精确地覆盖TextBox中的“ 5”,这正是我想要的。另外请注意,列表中最后一个“ 5”下方的空格不应该是足够的。

ListView的高度是ListViewItem和TextBox Height的倍数(5 * 30 = 150),据我所知,应为正确的高度。

谁能告诉我我做错了什么/想念什么-以便ListView的中间“ 5”正好覆盖了TextBox中的“ 5”?

1 个答案:

答案 0 :(得分:1)

wpf文本框为'g'之类的字母提供了一些空白(抱歉,对于基线以下的这些额外像素,不知道正确的用语:-))

因此,您可以尝试调整文本框的填充,例如:TextBox Padding

是否需要编辑条目?如果不是,请使用TextBlock代替VerticalAlignment =“ Center”。这个应该更好。。。

您还可以在样式中定义ListViewItem的数据模板,我认为默认情况下为“ ContentPresenter”,将其转换为TextBox应该直接在上方呈现。

当显示ListView时,我将关闭TextBox的可见性。因为“中间”项可能是“ 6” ...如果我没错,您正在为值构建一些滚动选择器。

编辑:

经过一些测试,ListView / ListBox控件实现了一些内部填充。除非您完全想重新设置它们的样式,否则最好的选择就是设置

HorizontalOffset=" -2"
VerticalOffset="-2"
弹出控件的

...或根据需要。 ?绝对是:)

我想您也会在生产代码中使用一些数据绑定,而这现在只是设计测试:)