powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Использование в ListBox.ItemsPanel панели Canvas
25 сообщений из 27, страница 1 из 2
Использование в ListBox.ItemsPanel панели Canvas
    #39758711
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использовал в 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
Использование в ListBox.ItemsPanel панели Canvas
    #39758720
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld Hasp,

В канвасе без координат объекты имеют координаты 0,0,0,0, надо определить координаты и размеры объектов через measure arrange
...
Рейтинг: 0 / 0
Использование в ListBox.ItemsPanel панели Canvas
    #39758740
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes, я же задаю Canvas.Left...
Рассчитываю, для этого примера, что каждый элемент будет сдвигаться на указанную позицию...
А размеры Border, как я думал, должен принять в соответствии с содержимым.
Или по иному, это всё делать надо?
...
Рейтинг: 0 / 0
Использование в ListBox.ItemsPanel панели Canvas
    #39758756
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Использование в ListBox.ItemsPanel панели Canvas
    #39758757
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну точнее полностью можно так
Код: 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
Использование в ListBox.ItemsPanel панели Canvas
    #39758759
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Использование в ListBox.ItemsPanel панели Canvas
    #39758760
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На будущее - давай код, который можно сразу запускать (в данном случае пришлось воссоздавать класс local:SmallExampClass, не долго, но всё же)
...
Рейтинг: 0 / 0
Использование в ListBox.ItemsPanel панели Canvas
    #39758762
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, СПАСИБО!
Вот я тупанул! И главное, стоко времени потратил, но сам так и не смог сообразить, что просто не то позиционирую!
...
Рейтинг: 0 / 0
Использование в ListBox.ItemsPanel панели Canvas
    #39758764
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProНа будущее - давай код, который можно сразу запускать (в данном случае пришлось воссоздавать класс local:SmallExampClass, не долго, но всё же)Да, учту - моя оплошность.
Ещё раз, СПАСИБО!
...
Рейтинг: 0 / 0
Использование в ListBox.ItemsPanel панели Canvas
    #39758843
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Использование в ListBox.ItemsPanel панели Canvas
    #39758852
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эээээ..... это вопрос? или о чём?
...
Рейтинг: 0 / 0
Использование в ListBox.ItemsPanel панели Canvas
    #39758901
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProЭээээ..... это вопрос? или о чём?Нет. Не вопрос. Объяснил, до чего без Вашей помощи не смог додуматься.
...
Рейтинг: 0 / 0
Использование в ListBox.ItemsPanel панели Canvas
    #39758904
Eld Hasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProЭээээ..... это вопрос? или о чём?появился вопрос!
Как я понял, Border располагается не в панели, а в ControlTemplate.
Поэтому указание на позицию Border в панели игнорируется.
Зачем тогда в шаблоне данных указывать Canvas.Left="{Binding PropInt}" ?

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

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

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

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

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

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

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

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

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


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