Я следовал рекомендациям и другие сообщения SO о том, как полностью отображать элементы 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, открывается всплывающее окно, в котором отображается ListView с 5 видимыми элементами:
Теперь, как вы можете видеть, средний элемент не точно покрывает цифру «5» в TextBox, чего я и хочу. Также обратите внимание, что места под последней цифрой «5» в списке не так много, как должно быть.
Высота ListView кратна высоте ListViewItem и TextBox (5 * 30 = 150), что, в моем понимании, должно быть правильной высотой.
Может ли кто-нибудь сказать мне, что я делаю неправильно / не хватает - чтобы средняя цифра «5» ListView точно покрывала «5» в TextBox?





в текстовом поле wpf есть отступы для обозначения места для таких букв, как 'g' (извините, я не знаю правильного термина для этих дополнительных пикселей ниже базовой линии :-))
Таким образом, вы можете попробовать настроить заполнение вашего текстового поля, как здесь: Заполнение текстового поля
Нужно ли редактировать записи? В противном случае используйте TextBlock вместо VerticalAlignment = "Center". Это будет лучше ...
Вы также можете определить табличку данных вашего ListViewItem в своем стиле, я думаю, что это «ContentPresenter» по умолчанию, преобразование его в TextBox должно отображаться непосредственно выше.
И я бы отключил видимость TextBox при отображении ListView. так как "средний" элемент может быть '6' ... Если я прав, вы создаете какой-то селектор прокрутки для значений ...
Обновлено:
после некоторого тестирования в ListView / ListBox Control были реализованы некоторые внутренние отступы. Если вы не хотите полностью изменить их стиль, лучшим вариантом будет установка
HorizontalOffset = " -2"
VerticalOffset = "-2"
всплывающего элемента управления ... или по мере необходимости. Хакиш? Определенно :)
Я предполагаю, что вы также будете использовать некоторые привязки данных для своего производственного кода, и сейчас это всего лишь тест дизайна :)
Кстати, просто попытался поместить ContentTemplate для ListViewItem с TextBlock в нем. К сожалению, он на 100% совпадает с моей исходной проблемой.
Думаю, это могло быть решением. Но как вы говорите, это хакерское занятие. Например, на моем экране смещение должно быть -3. Я подожду, чтобы увидеть, есть ли у кого-нибудь еще решение, которое будет одновременно простым и зрелым. Спасибо за помощь, очень признателен!
@werner значения (-2, -2) получены в результате использования TextBlock в качестве шаблона. С TextBoxes это (0, -3), как и в вашем случае, так что это не (обязательно) связано с восстановлением экрана или аналогичными проблемами, это происходит из-за используемого вами элемента управления. Но все равно пахнет хакой :). Как я уже сказал, вы можете изменить стиль элемента ListView ItemPanel, и это может быть «реальным» решением.
Да ладно, вообще-то вроде работает на разных устройствах. Итак, дело сделано :) Спасибо.
рад мог помочь :)
Но проблема в ListView и ListViewItem (а не в TextBox)? Я могу сделать несколько трюков, чтобы сделать это намного лучше, да, но в конце концов мне действительно нужно, чтобы средняя цифра 5 в ListView была точно над цифрой 5 в TextBox. А также понять, как / почему :)