Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2014, 23:22   #1
Stepler415
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 16
По умолчанию Необычный ListView с панелью при клике, возможно?

Приветствую, возможно ли сделать такой ListView как на картинке? Картинка естественно фотошопная)) Но суть от этого не меняется. При клике на item в списке ListView, показать панель под итемом по которому кликнули (не закрывая панелью элементы, а сместить их под панель). Если такое возможно то расскажите как осуществить, желательно с практикой)
Stepler415 вне форума Ответить с цитированием
Старый 03.11.2014, 23:46   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

WPF? WinForms?
Во втором, конечно, сложнее.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 04.11.2014, 00:04   #3
Stepler415
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 16
По умолчанию

Alex11223, - WPF! Вы подали надежду а то я уже свой велосипед начал делать на подобие ListView. На этой панели планирую размещать информацию, желательно пример в динамическом варианте, но вы можете объяснить как вам удобнее)

Последний раз редактировалось Stepler415; 04.11.2014 в 00:10.
Stepler415 вне форума Ответить с цитированием
Старый 04.11.2014, 00:28   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

В WPF это делается путем создания собственного ItemTemlpate(тут пример), в котором данную панель и прорисовываем. А прячем-показываем её путем Binding'a на свойство IsSelected (не помню правда, точно есть ли оно у ListViewitem), либо с помощью триггеров.

P.S. другой вариант - модифицировать ItemContainerStyle у listView. Все зависит от того, что конкретно вы хотели на данной панели разместить (в смысле, если доп.информацию о выделеном Item'e - тогда лучше через ItemTemplate; если только какие-то отвязанные от выделенного Item'a данные, то через ItemContainerStyle )

P.P.S. небольшой пример
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 04.11.2014 в 00:31.
Luuzuk вне форума Ответить с цитированием
Старый 04.11.2014, 00:52   #5
Stepler415
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 16
По умолчанию

Спасибо, на панели хочу разместить кнопки и прочие элементы wpf. Вы можете показать как сделать такую панель при помощи ItemContainerStyle, что бы можно было задать этой панели имя и высоту. А дальше я по имени этой панели накидаю динамически то что мне нужно. Я не совсем понимаю эти стили, в некоторых случаях пишу для себя велосипеды чтобы не связываться с ними..
Задача проста: Кликнуть по итему показать панель, ещё раз кликнуть скрыть панель.
Stepler415 вне форума Ответить с цитированием
Старый 04.11.2014, 09:06   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Вы подали надежду
Чего я подал? Я просто спросил WPF или WinForms потому что создатель разделов додумался поместить их в один раздел.

Не понял что за имя у панели вам надо, но с высотой не должно быть проблем.
Вот на основе примера по ссылке выше (анимацию убрал, все равно она как-то не очень работала).

Вообще обычно у панели не задают размер, только у элементов внутри нее, а исходя из них уже определяется размер панели.

Код:
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm ="clr-namespace:WpfApplication1.ViewModel"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <vm:ViewModel x:Key="viewModel"/>
    </Window.Resources>
    <Grid DataContext="{StaticResource viewModel}">
        
        <ListView ItemsSource="{Binding Products}">
            <ListView.Resources>
                <!-- this is what unselected items will look like -->
                <DataTemplate x:Key="DefaultItemTemplate">
                    <TextBlock Margin="3" FontSize="12"
                               Text="{Binding Name}" />
                </DataTemplate>

                <!-- this is what selected items will look like -->
                <DataTemplate x:Key="SelectedItemTemplate">
                    <Grid MinHeight="80" MaxHeight="150"> <!-- or just Height -->
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>

                        <TextBlock Margin="3" FontSize="12" FontWeight="Bold"
                                   Text="{Binding Name}" />
                        
                        <TextBox Grid.Row="1" Margin="3,10,3,3" Width="300" MinLines="6"
                                 AcceptsReturn="True" VerticalScrollBarVisibility="Auto"
                                 Text="{Binding Description}"/>
                    </Grid>
                </DataTemplate>
            </ListView.Resources>

            <ListView.ItemContainerStyle>
                <Style TargetType="ListBoxItem">

                    <!-- default item template when not selected -->
                    <Setter Property="ContentTemplate" Value="{StaticResource DefaultItemTemplate}" />
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <!-- when selected change item template -->
                            <Setter Property="ContentTemplate" Value="{StaticResource SelectedItemTemplate}" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
    </Grid>
</Window>
Код:
using System.Collections.ObjectModel;

namespace WpfApplication1.ViewModel
{
    public class Product
    {
        public string Name { get; set; }
        public string Description { get; set; }
    }

    public class ViewModel
    {
        public ObservableCollection<Product> Products { get; set; }

        public ViewModel()
        {
            Products = new ObservableCollection<Product>();
            Products.Add(new Product() { Name = "Product1", Description = "Description1\r\nDescription1\r\nDescription1\r\n" });
            Products.Add(new Product() { Name = "Product2", Description = "Description2\r\nDescription2\r\nDescription2\r\n" });
        }
    }
}
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 04.11.2014 в 09:21.
Alex11223 вне форума Ответить с цитированием
Старый 04.11.2014, 18:29   #7
Stepler415
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 16
По умолчанию

Alex11223, Спасибо, пример работает, но если добавить колонки то нет, а мне нужно с колонками.
Stepler415 вне форума Ответить с цитированием
Старый 04.11.2014, 20:05   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

С колонками сложнее потому что тогда вроде бы есть только CellTemplate для каждой ячейки в строке, а не для всей строки.

Я не знаю варианта лучше, кроме реализации колонок самому с помощью Grid (у грида для заголовка и у гридов в темплейтах ListView колонки должны быть одинакового размера: то есть либо просто одинаковые значения Width, тут *, либо SharedSizeGroup).

Код:
<Window.Resources>
    <vm:ViewModel x:Key="viewModel"/>

    <Style x:Key="cellBorder" TargetType="Border">
        <Setter Property="BorderBrush" Value="#F0F0F0" />
        <Setter Property="BorderThickness" Value="1" />
    </Style>
</Window.Resources>
<Grid DataContext="{StaticResource viewModel}">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!-- headers -->
        <Grid Grid.Row="0" Background="#FDFDFD">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>

            <Border Grid.Column="0" Style="{StaticResource cellBorder}">
                <TextBlock HorizontalAlignment="Center" Text="Name"/>
            </Border>
            <Border Grid.Column="1" Style="{StaticResource cellBorder}">
                <TextBlock HorizontalAlignment="Center" Text="Price"/>
            </Border>
        </Grid>

        <ListView Grid.Row="1" BorderThickness="0" HorizontalContentAlignment="Stretch"
              ItemsSource="{Binding Products}">
            <ListView.Resources>
                <!-- this is what unselected items will look like -->
                <DataTemplate x:Key="DefaultItemTemplate">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>

                        <TextBlock Grid.Column="0" Margin="3" FontSize="12"
                               Text="{Binding Name}" />
                        <TextBlock Grid.Column="1" Margin="3" FontSize="12"
                               Text="{Binding Price}" />
                    </Grid>
                </DataTemplate>

                <!-- this is what selected items will look like -->
                <DataTemplate x:Key="SelectedItemTemplate">
                    <Grid MinHeight="80" MaxHeight="150">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>

                        <!-- normal row data (with bold) -->
                        <TextBlock Grid.Row="0"  Grid.Column="0" Margin="3" FontSize="12" FontWeight="Bold"
                               Text="{Binding Name}" />
                        <TextBlock Grid.Row="0" Grid.Column="1" Margin="3" FontSize="12" FontWeight="Bold"
                               Text="{Binding Price}" />

                        <!-- the panel below row -->
                        <Grid Grid.Row="1" Grid.ColumnSpan="2" Margin="0,10,0,0">
                            <TextBox Margin="3" HorizontalAlignment="Left" Width="300" MinLines="6"
                                     AcceptsReturn="True" VerticalScrollBarVisibility="Auto"
                                    Text="{Binding Description}"/>
                        </Grid>
                    </Grid>
                </DataTemplate>
            </ListView.Resources>
            
            <ListView.ItemContainerStyle>
                <Style TargetType="ListBoxItem">

                    <!-- default item template when not selected -->
                    <Setter Property="ContentTemplate" Value="{StaticResource DefaultItemTemplate}" />
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <!-- when selected change item template -->
                            <Setter Property="ContentTemplate" Value="{StaticResource SelectedItemTemplate}" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>
    </Grid>
</Grid>
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 04.11.2014 в 20:12.
Alex11223 вне форума Ответить с цитированием
Старый 05.11.2014, 20:45   #9
Stepler415
Пользователь
 
Регистрация: 08.01.2012
Сообщений: 16
По умолчанию

Alex11223, спасибо. Вот с размерами колонок проблема, некоторые из них нужно регулировать или хотя бы ставить индивидуальный размер для каждой колонки.

Последний раз редактировалось Stepler415; 05.11.2014 в 21:06.
Stepler415 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
2 действия при клике на картинку glazik HTML и CSS 1 21.01.2013 23:54
Нужно при двойном клике на строку listView открыть другую форму и передать даные в текстбоксы из txt vitiok1 C# (си шарп) 5 17.02.2012 19:16
Возможно ли при нажатии на файл в listbox выведется его размер в listView илья001 Помощь студентам 3 01.12.2011 19:29
Редактирование при двойном клике по столбцу в ListView MasterofCDM Компоненты Delphi 3 18.11.2010 16:07
Сортировка при клике на колонке mental БД в Delphi 6 23.12.2009 17:07