Здравствуйте.
Есть такая задача на стилизацию.
На скрине есть два компонента.
Сверху ListControl со своими стилями и снизу ListView с простыми стилями.
То что сверху при связывании с реальными данными жрет памяти 10 гигов и виснет на рендеринг минут на 10 при размераз коллекций свыше 10 000.
А цель отобразить свыше 500 000.
ListView отображает все за секунду или меньше. Но он не вытягивает Border до границ и видно выделение.
Задача выделение не отображать и вытянуть до конца контрола.
Курил гугл, но почему то предложенные методы не помогают.
<ListBox x:Name="rList" Grid.Row="2" Background="AliceBlue" HorizontalAlignment="Stretch">
<ListBox.Resources> // ЭТО БЫЛО НА ОДНОМ РЕСУРСЕ ДЛЯ СПРЯТЫВАНИЯ ВЫДЕЛЕНИЯ НЕ РАБОТАЕТ
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
</ListBox.Resources>
<ListBox.ItemContainerStyle> // ЭТО БЫЛО НА ДРУГОМ РЕСУРСЕ НЕ РАБОТАЕТ
<Style TargetType="ListBoxItem">
<Setter Property="Focusable" Value="false"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<Border Name="brd" Visibility="{Binding Path=Item.Visible}" HorizontalAlignment="Stretch" Background="{Binding BackColor}" Tag="{Binding}" BorderBrush="{StaticResource ControlBordersBrush}" BorderThickness="1" Margin="1" PreviewMouseDown="OnPreviewMouseDown">
<Grid Margin="2" HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="1"/>
<ColumnDefinition Width="99*"/>
</Grid.ColumnDefinitions>
<!--<CheckBox Name="_chbx" Margin="5,0,0,0" IsChecked="{Binding Path=IsChecked, Mode=Default, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" HorizontalAlignment="Center"/>-->
<TextBlock Margin="1,0,3,0" Text="{Binding Path= Item.SortIndex}" FontWeight="Bold" HorizontalAlignment="Center"/>
<Border Grid.Column="1" Width="1" BorderBrush="{StaticResource ControlBordersBrush}" BorderThickness="1"/>
<TextBlock Grid.Column="2" Margin="3,0,0,0" TextAlignment="Left" TextWrapping="Wrap" Text="{Binding Path=Item.FormattedString}"/>
</Grid>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
using System.Linq;
using System.Windows;
namespace WpfApp6
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
listView.ItemsSource = Enumerable.Range(1, 1000);
}
}
}
Взаимодействовать то нужно. Там элементы типа CheckBox. При щелчке меняют свой внешний вид и параметр Checktd/ Если запретить этот флаг то контрол полностью терает взаимодействие. По сути бы просто цвета прозрачныи сделать…
А вообще почему такая дичь то с производительностью?? какой толк то в этой WPF если все так ужасно тормозит.
Вот в том же проекте с теми же данными нужно отобразить все в таблицу.
Использую DataGrid. Но опять же при 100 000 строк рендеринг занимает просто невероятное количество времени.
И виртуализацию сделал как советуют … Но все равно это дикий кошмар??
И сделать таблицу из ListBox я так понял никаким образом нельзя??
Пытаюсь ковырять вот этот мануал
Virtualization only works if the grid is constrained in size.
If you place DataGrid inside ScrollViewer or StackPanel or any control that does not pass fix constraint to DataGrid it will break the virtualization in DataGrid.
The ScrollViewer.CanContentScroll value on the DataGrid element must be set to True in order for row virtualization to work properly. Here is an explanation of why it must be set this way.
В общем нашел вот такой результат:
Этот вариант действительно дает потрясающую производительность. 200 000 строк за секунду вылетают. но требуется дополнительно стили прописывать чтобы красота была.
Добавил везде растягивание но почему то не вмещает всю панель в форму.
Почему так??
Хотелось бы чтобы он съеживал таблицу по ширине формы.
И второе: Столбцы оформляются динамически и для них жестко не прописать ColumnDefinition.
Есть способ сформировать определения из кода но вот как достать UniformGrid из шаблона стиля?? Гугл какие то странные ответы предлагает.