Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Использование в ListBox.ItemsPanel панели Canvas / 25 сообщений из 27, страница 1 из 2
12.01.2019, 11:11
    #39758711
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Использовал в ItemsPanel панели WrapPanel, StackPanel. Всё было гладко ни каких проблем. Попытался с Canvas также сделать - полный тупик. Как можно Canvas использовать?
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
        <ListBox FontSize="30" >
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemsSource>
                <coll:ArrayList>
                    <local:SmallExampClass PropInt="0" PropString="Первый"/>
                    <local:SmallExampClass PropInt="50" PropString="Второй"/>
                    <local:SmallExampClass PropInt="100" PropString="Третий"/>
                    <local:SmallExampClass PropInt="150" PropString="Четвёртый"/>
                    <local:SmallExampClass PropInt="200" PropString="Пятый"/>
                </coll:ArrayList>
            </ListBox.ItemsSource>
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Border BorderThickness="5" Canvas.Left="{Binding PropInt}" BorderBrush="Brown" Margin="5">
                                    <TextBlock Text="{Binding PropString}" Margin="5"/>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>
...
Рейтинг: 0 / 0
12.01.2019, 12:24
    #39758720
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Eld Hasp,

В канвасе без координат объекты имеют координаты 0,0,0,0, надо определить координаты и размеры объектов через measure arrange
...
Рейтинг: 0 / 0
12.01.2019, 13:46
    #39758740
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Roman Mejtes, я же задаю Canvas.Left...
Рассчитываю, для этого примера, что каждый элемент будет сдвигаться на указанную позицию...
А размеры Border, как я думал, должен принять в соответствии с содержимым.
Или по иному, это всё делать надо?
...
Рейтинг: 0 / 0
12.01.2019, 14:52
    #39758756
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Eld HaspИли по иному, это всё делать надо?Немножко по иному
Код: xml
1.
2.
3.
4.
5.
6.
    <ListBox.ItemContainerStyle>
      <Style TargetType="ListBoxItem">
        <Setter Property="Canvas.Left" Value="{Binding PropInt}">
        </Setter>
      </Style>
    </ListBox.ItemContainerStyle>
...
Рейтинг: 0 / 0
12.01.2019, 14:54
    #39758757
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Ну точнее полностью можно так
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    <ListBox.ItemContainerStyle>
      <Style TargetType="ListBoxItem">
        <Setter Property="Canvas.Left" Value="{Binding PropInt}">
        </Setter>
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate>
              <Border BorderThickness="5" Canvas.Left="{Binding PropInt}" BorderBrush="Brown" Margin="5">
                <TextBlock Text="{Binding PropString}" Margin="5"/>
              </Border>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </Style>
    </ListBox.ItemContainerStyle>

и твой пример заработает. Но я бы не стал менять Template для ListBox.ItemContainerStyle - зачем? Просто надо сделать шаблон для local:SmallExampClass
...
Рейтинг: 0 / 0
12.01.2019, 14:56
    #39758759
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Shocker.ProНо я бы не стал менять Template для ListBox.ItemContainerStyle - зачем? Просто надо сделать шаблон для local:SmallExampClassвот так
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  <ListBox FontSize="30">
    <ListBox.Resources>
      <DataTemplate DataType="{x:Type local:SmallExampClass}">
        <Border BorderThickness="5" Canvas.Left="{Binding PropInt}" BorderBrush="Brown" Margin="5">
          <TextBlock Text="{Binding PropString}" Margin="5"/>
        </Border>
      </DataTemplate>
    </ListBox.Resources>
    <ListBox.ItemsPanel>
      <ItemsPanelTemplate>
        <Canvas/>
      </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemsSource>
      <coll:ArrayList>
        <local:SmallExampClass PropInt="0" PropString="Первый"/>
        <local:SmallExampClass PropInt="100" PropString="Второй"/>
        <local:SmallExampClass PropInt="200" PropString="Третий"/>
        <local:SmallExampClass PropInt="300" PropString="Четвёртый"/>
        <local:SmallExampClass PropInt="400" PropString="Пятый"/>
      </coll:ArrayList>
    </ListBox.ItemsSource>
    <ListBox.ItemContainerStyle>
      <Style TargetType="ListBoxItem">
        <Setter Property="Canvas.Left" Value="{Binding PropInt}" />
      </Style>
    </ListBox.ItemContainerStyle>
  </ListBox>
...
Рейтинг: 0 / 0
12.01.2019, 14:57
    #39758760
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
На будущее - давай код, который можно сразу запускать (в данном случае пришлось воссоздавать класс local:SmallExampClass, не долго, но всё же)
...
Рейтинг: 0 / 0
12.01.2019, 14:59
    #39758762
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Shocker.Pro, СПАСИБО!
Вот я тупанул! И главное, стоко времени потратил, но сам так и не смог сообразить, что просто не то позиционирую!
...
Рейтинг: 0 / 0
12.01.2019, 15:00
    #39758764
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Shocker.ProНа будущее - давай код, который можно сразу запускать (в данном случае пришлось воссоздавать класс local:SmallExampClass, не долго, но всё же)Да, учту - моя оплошность.
Ещё раз, СПАСИБО!
...
Рейтинг: 0 / 0
12.01.2019, 22:04
    #39758843
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Shocker.ProShocker.ProНо я бы не стал менять Template для ListBox.ItemContainerStyle - зачем? Просто надо сделать шаблон для local:SmallExampClassвот так Пробовал, но самому сообразить это не получилось.
Код: xml
1.
2.
3.
4.
    <ListBox.ItemContainerStyle>
      <Style TargetType="ListBoxItem">
        <Setter Property="Canvas.Left" Value="{Binding PropInt}" />
      </Style>
...
Рейтинг: 0 / 0
12.01.2019, 22:34
    #39758852
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Эээээ..... это вопрос? или о чём?
...
Рейтинг: 0 / 0
13.01.2019, 08:14
    #39758901
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Shocker.ProЭээээ..... это вопрос? или о чём?Нет. Не вопрос. Объяснил, до чего без Вашей помощи не смог додуматься.
...
Рейтинг: 0 / 0
13.01.2019, 09:05
    #39758904
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Shocker.ProЭээээ..... это вопрос? или о чём?появился вопрос!
Как я понял, Border располагается не в панели, а в ControlTemplate.
Поэтому указание на позицию Border в панели игнорируется.
Зачем тогда в шаблоне данных указывать Canvas.Left="{Binding PropInt}" ?

И второй вопрос, для отображения списка элементов в Canvas, использование ListBox - нормальный подход?
Или есть лучшие варианты?
...
Рейтинг: 0 / 0
13.01.2019, 09:24
    #39758905
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Может лучше напрямую как-то Canvas использовать? Но в панелях нет шаблонов....,вроде бы.
...
Рейтинг: 0 / 0
13.01.2019, 16:10
    #39758981
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Eld HaspЗачем тогда в шаблоне данных указывать Canvas.Left="{Binding PropInt}" ?Забыл выпилить
Eld HaspИ второй вопрос, для отображения списка элементов в Canvas, использование ListBox - нормальный подход?Ну именно ListBox смысла нет, используй ItemsControl

Eld HaspМожет лучше напрямую как-то Canvas использовать? Но в панелях нет шаблонов....,вроде бы.В ItemsControl ты даешь список объектов, необязательно визуальных, поэтому и применяется шаблон. И тут ты спокойно можешь использовать IEnumerable в качестве источника. А в панель ты складываешь визуальные элементы напрямую.

Рассматривай ItemsControl как оболочку для произвольной панели, которая поддерживает IEnumerable обычных объектов. Когда такой функционал не требуется, тогда используешь панель напрямую без оболочки
...
Рейтинг: 0 / 0
13.01.2019, 16:17
    #39758986
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Shocker.ProНу именно ListBox смысла нет, используй ItemsControlА, ну если нужно выделение элементов, тогда ListBox - да
...
Рейтинг: 0 / 0
13.01.2019, 22:26
    #39759090
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Shocker.ProShocker.ProНу именно ListBox смысла нет, используй ItemsControlА, ну если нужно выделение элементов, тогда ListBox - даДа, выделение нужно.
А как быть если несколько типов элементов?
Как DataTemplate настроить на вывод разных фигур?
Или надо UC делать?
...
Рейтинг: 0 / 0
13.01.2019, 22:52
    #39759099
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Так же, как и в моем примере.
Код: xml
1.
2.
    <ListBox.Resources>
      <DataTemplate DataType="{x:Type local:SmallExampClass}">

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

А если эти элементы используются в разных местах, можно добавить шаблоны в ресурсы окна или вообще приложения (app.xaml)
...
Рейтинг: 0 / 0
15.01.2019, 20:35
    #39759997
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Shocker.ProТак же, как и в моем примере.
Код: xml
1.
2.
    <ListBox.Resources>
      <DataTemplate DataType="{x:Type local:SmallExampClass}">

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

А если эти элементы используются в разных местах, можно добавить шаблоны в ресурсы окна или вообще приложения (app.xaml)
Не всё понял.
Допустим как сделать всё в ресурсах ListBox понятно:
ViewModel
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    public class ViewModel
    {
        public List<FigureClass> Figures { get; set; } = new List<FigureClass>();
    }

    public class FigureClass
    {
        public double Top { get; set; }
        public double Left { get; set; }
    }
    public class RectangleClass : FigureClass
    {
        public double Width { get; set; }
        public double Height { get; set; }
    }
    public class Circle: FigureClass
    {
        public double Radius { get; set; }
    }

Словарь MyDictionary.xaml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:TwoDataTemplate">
    <local:ViewModel x:Key="ViewModel">
        <local:ViewModel.Figures>
            <local:RectangleClass Top="10" Left="20" Width="15" Height="25"/>
            <local:Circle Top="40" Left="10" Radius="40"/>
            <local:RectangleClass Top="70" Left="100" Width="30" Height="30"/>
            <local:Circle Top="100" Left="80" Radius="15"/>
        </local:ViewModel.Figures>
    </local:ViewModel>
    <DataTemplate DataType="{x:Type local:RectangleClass}" x:Key="RectangleTemplate">
        <Rectangle Width="{Binding Width}" Height="{Binding Height}" Stroke="Red"/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:Circle}" x:Key="CircleTemplate">
        <Ellipse Height="{Binding Radius}" Width="{Binding ActualHeight, Mode=OneWay, RelativeSource={RelativeSource Self}}" Stroke="Green"/>
    </DataTemplate>
</ResourceDictionary>

Окно
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
<Window x:Class="TwoDataTemplate.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:TwoDataTemplate"
        mc:Ignorable="d" DataContext="{StaticResource ViewModel}"
        Title="MainWindow" Height="200" Width="200">
    <Window.Resources>
        <ResourceDictionary Source="MyDictionary.xaml"/>
    </Window.Resources>
    <Grid>
        <ListBox FontSize="30" ItemsSource="{Binding Figures}">
            <ListBox.Resources>
                <DataTemplate DataType="{x:Type local:RectangleClass}">
                    <Rectangle Width="{Binding Width}" Height="{Binding Height}" Stroke="Red"/>
                </DataTemplate>
                <DataTemplate DataType="{x:Type local:Circle}">
                    <Ellipse Height="{Binding Radius}" Width="{Binding ActualHeight, Mode=OneWay, RelativeSource={RelativeSource Self}}" Stroke="Green"/>
                </DataTemplate>
            </ListBox.Resources>
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="Canvas.Left" Value="{Binding Left}" />
                    <Setter Property="Canvas.Top" Value="{Binding Top}" />
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>
    </Grid>
</Window>


Но вот с концовкой Вашего сообщения....
Не понял. Как можно в ListBox использовать несколько DataTemplate из словаря? В примере это RectangleTemplate и CircleTemplate.
DataTemplate, вроде же, не наследуются?
...
Рейтинг: 0 / 0
15.01.2019, 20:53
    #39760002
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Про наследование не очень понял, что имеется ввиду.
В данном случае надо:
а) убрать ресурсы из ListBox
б) в MyDictionary.xaml у ресурсов удалить ключи (x:Key="RectangleTemplate" и x:Key="CircleTemplate")
...
Рейтинг: 0 / 0
15.01.2019, 21:31
    #39760012
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Shocker.ProПро наследование не очень понял, что имеется ввиду.
В данном случае надо:
а) убрать ресурсы из ListBox
б) в MyDictionary.xaml у ресурсов удалить ключи (x:Key="RectangleTemplate" и x:Key="CircleTemplate")Как по умолчанию использовать я понял. Но есть ли, возможность выбирать по ключам как для стилей?
Допустим, для одного типа есть несколько представлений. Как можно указать какое-именно из них использовать?
Для стилей, в таком случае, можно указать в ресурсах стиль по умолчанию наследуемый от стиля с ключом. А как быть с DataTemplete?
...
Рейтинг: 0 / 0
15.01.2019, 22:31
    #39760023
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
А, я, наконец, понял вопрос.
Ну тут два варианта, на мой взгляд. Можно написать свой TemplateSelector, а можно, в принципе и DataTemplate наследовать, что-то типа

Код: xml
1.
2.
3.
      <DataTemplate DataType="{x:Type local:RectangleClass}">
        <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{StaticResource RectangleTemplate}" />
      </DataTemplate>
...
Рейтинг: 0 / 0
15.01.2019, 22:34
    #39760025
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Но в принципе, я еще ни разу не столкнулся с ситуацией, когда для одного класса существуют принципиально разные шаблоны (хотя и не утверждаю, что такого не может быть в какой-то ситуации). А с другой стороны опять же ничто не мешает делать наследование классов на стороне модели, то есть даже класс-пустышку в общем случае, для которого существует отдельный шаблон.
...
Рейтинг: 0 / 0
15.01.2019, 22:36
    #39760027
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Shocker.Proто есть даже класс-пустышку в общем случае, для которого существует отдельный шаблон.... скажем, базовый абстрактный класс с основным функционалом и несколько пустых наследников по числу необходимых шаблонов
...
Рейтинг: 0 / 0
16.01.2019, 00:00
    #39760050
Eld Hasp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в ListBox.ItemsPanel панели Canvas
Shocker.ProНо в принципе, я еще ни разу не столкнулся с ситуацией, когда для одного класса существуют принципиально разные шаблоны (хотя и не утверждаю, что такого не может быть в какой-то ситуации). А с другой стороны опять же ничто не мешает делать наследование классов на стороне модели, то есть даже класс-пустышку в общем случае, для которого существует отдельный шаблон.Такой пример - откуда у меня возник вопрос.
В ListView для класса одно представление удобное для списка. Выбранный элемент отображается в другом - более полном и удобном для редактирования.

Вариант с "пустышкой" понятен. То же выход.

Ещё вариант, до которого сам додумался, сделать один класс для всего со всеми свойствами наследников. И в нём ввести свойство переключающее представление. По этому свойству менять Visibility у элементов в шаблоне. Но это порождает множество элементов, пусть и невидимых. Не слишком ли криво это?

Если вернуться к началу темы. Для DataTemplate не существует каких-то триггеров, селекторов (или чего-то подобного) позволяющего изменить представление или переключаться между ними?
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Использование в ListBox.ItemsPanel панели Canvas / 25 сообщений из 27, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]