我一直在遵循准则和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时,弹出窗口打开并显示具有5个可见项的ListView:
现在您可以看到,中间的项目不能精确地覆盖TextBox中的“ 5”,这正是我想要的。另外请注意,列表中最后一个“ 5”下方的空格不应该是足够的。
ListView的高度是ListViewItem和TextBox Height的倍数(5 * 30 = 150),据我所知,应为正确的高度。
谁能告诉我我做错了什么/想念什么-以便ListView的中间“ 5”正好覆盖了TextBox中的“ 5”?
答案 0 :(得分:1)
wpf文本框为'g'之类的字母提供了一些空白(抱歉,对于基线以下的这些额外像素,不知道正确的用语:-))
因此,您可以尝试调整文本框的填充,例如:TextBox Padding
是否需要编辑条目?如果不是,请使用TextBlock代替VerticalAlignment =“ Center”。这个应该更好。。。
您还可以在样式中定义ListViewItem的数据模板,我认为默认情况下为“ ContentPresenter”,将其转换为TextBox应该直接在上方呈现。
当显示ListView时,我将关闭TextBox的可见性。因为“中间”项可能是“ 6” ...如果我没错,您正在为值构建一些滚动选择器。
编辑:
经过一些测试,ListView / ListBox控件实现了一些内部填充。除非您完全想重新设置它们的样式,否则最好的选择就是设置
HorizontalOffset=" -2"
VerticalOffset="-2"
弹出控件的...或根据需要。 ?绝对是:)
我想您也会在生产代码中使用一些数据绑定,而这现在只是设计测试:)