powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Canvas + ListView
17 сообщений из 17, страница 1 из 1
Canvas + ListView
    #39887185
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
У меня в ListVew через ItemSource привязан набор некоторых сущностей. Хотелось бы показать картинку для каждой сущности, но картинку формировать налету в зависимости от атрибутов сущности. У меня в коде есть функция, которая добавляет в Canvas необходимые геометрические фигуры. Когда canvas принадлежит просто окну, то все работает. Но тут не могу понять, как его прицепить, чтобы для каждой сущности при создании соответствующей строки ListView формировалось необходимое изображение. Может есть какое-то событие OnCreate для строк или что-то подобное? или как это правильно сделать?
Примерно - сущность содержит длину и ширину, надо на канвасе нарисовать прямоугольник с соответствующими размерами.
...
Рейтинг: 0 / 0
Canvas + ListView
    #39887188
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно заменить ItemTemplate для ListView на свой, с канвасом и прочими пирожками.
...
Рейтинг: 0 / 0
Canvas + ListView
    #39887192
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Свой DataTemplate я сделал, канвас у меня есть в каждом Item, но как при выводе Item в канвасе нарисовать геометрические фигуры? Заранее прямоугольник поместить нельзя - их несколько может быть и не только прямоугольники. Т.е. надо на лету формировать фигуры для канваса. У меня такая функция есть - принимает экземпляр сущности и канвас, размещает на канвас фигуры. Как заставить эту функцию работать на лету при создании Item'ов?
...
Рейтинг: 0 / 0
Canvas + ListView
    #39887197
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужно подложить код, то можно сделать свой контрол (унаследоваться от Canvas, ContentControl или что там будет логичнее, или создать свой UserControl) и разместить этот контрол в шаблоне
...
Рейтинг: 0 / 0
Canvas + ListView
    #39887198
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Спасибо!
Вариант с UserControl мне кажется проще. Правильно ли я понял, что мне надо создать контрол с канвасом, открытым свойством типа моего класса и методом типа Update()? Или сразу в конструктор контрола передавать класс?
...
Рейтинг: 0 / 0
Canvas + ListView
    #39887199
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений, WPF - это прежде всего MVVM, забудь о методах, всё строится на привязках данных.

Да, ты передаешь модель Item-а через свойство зависимости в свой контрол и обрабатываешь изменение этого свойства.
...
Рейтинг: 0 / 0
Canvas + ListView
    #39887210
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Понял, спасибо большое. Буду разбираться с Dependency Property.
...
Рейтинг: 0 / 0
Canvas + ListView
    #39887274
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте геометрию. Но есть одно но, если вы используйте много горизонтальных и вертикальных линий возникает проблема с тем, что линия может оказать не точно на пикселе, а между 2мя пикселями и будет размыта. Вообще эта проблема не зависит от способа, но когда линия является визуальным объектом (а не геометрией) её можно выровнять по пикселям с помощью свойства SnapsToDevicePixels, иначе придется использовать DrawingImage в котором размещать геометрию которая в примере и настраивать GuidelineSet, по которому геометрия и будет выравниваться.



Код: 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.
<Window x:Class="WpfApp11.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:WpfApp11"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:MainModel/>
    </Window.DataContext>
    <Window.Resources>
        <local:ItemModelToGeometry x:Key="ItemModelToGeometry"/>

        <DataTemplate x:Key="{x:Type local:ItemModel}" DataType="{x:Type local:ItemModel}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="40"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Path Data="{Binding Converter={StaticResource ItemModelToGeometry}}"
                      Stroke="Black" StrokeThickness="1" >
                </Path>
                <TextBlock Grid.Column="1" Text="{Binding Name}"/>
            </Grid>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ListBox ItemsSource="{Binding Items}"
                 ItemTemplate="{StaticResource {x:Type local:ItemModel}}"/>
    </Grid>
</Window>


Код: c#
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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Media;

namespace WpfApp11
{
    internal class ItemModel
    {
        public string Name { set; get; }
        public double Left { set; get; }
        public double Top { set; get; }
        public double Width { set; get; }
        public double Height { set; get; }
    }
    internal class MainModel
    {
        public List<ItemModel> Items { set; get; }

        public MainModel()
        {
            Items = GetItems();
        }

        private List<ItemModel> GetItems()
        {
            const int itemsCount = 100;
            var rnd = new Random();
            var items = new List<ItemModel>(itemsCount);
            for (var i = 0; i < itemsCount; i++)
            {
                var item = new ItemModel
                {
                    Name = $"Items #{i:00}",
                    Left = rnd.NextDouble() * 10,
                    Top = rnd.NextDouble() * 10,
                    Width = rnd.NextDouble() * 20,
                    Height = rnd.NextDouble() * 20
                };
                items.Add(item);
            }
            return items;
        }
    }

    internal class ItemModelToGeometry : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is ItemModel item)
            {
                Geometry geometry = new PathGeometry()
                {

                    Figures =
                    {
                        new PathFigure()
                        {
                            StartPoint = new Point(item.Left, item.Top),
                            Segments =
                            {
                                new PolyLineSegment()
                                {
                                    Points =
                                    {
                                        new Point(item.Left + item.Width, item.Top),
                                        new Point(item.Left + item.Width, item.Top + item.Height),
                                        new Point(item.Left, item.Top + item.Height),
                                    }
                                }
                            },
                            IsClosed = true
                        }
                    }
                };
                geometry.Freeze();
                return geometry;
            }
            throw new ArgumentException();

        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
...
Рейтинг: 0 / 0
Canvas + ListView
    #39887286
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
иначе придется использовать DrawingImage в котором размещать геометрию которая в примере и настраивать GuidelineSet, по которому геометрия и будет выравниваться.

Можно просто отнаследоваться от UIElement, и всё это сделать в OnRender.
...
Рейтинг: 0 / 0
Canvas + ListView
    #39889357
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю всех за ответы
Roman Mejtes, спасибо за пример кода.
Код: xml
1.
2.
3.
                <Path Data="{Binding Converter={StaticResource ItemModelToGeometry}}"
                      Stroke="Black" StrokeThickness="1" >
                </Path>


Правильно ли я понимаю, что это универсальный способ привязки любого кода (через конвертер)? Т.е. в моем случае это будет такой аналог события OnCreate?
...
Рейтинг: 0 / 0
Canvas + ListView
    #39889369
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений, Екатеринбург
Правильно ли я понимаю, что это универсальный способ привязки любого кода (через конвертер)?

Если тип данных привязанного значения совпадает с типом DependencyProperty, к которому сделана привязка, либо допускает неявную конвертацию в тип DependencyProperty, то конвертер не нужен.
Евгений, Екатеринбург
Т.е. в моем случае это будет такой аналог события OnCreate?

OnCreate здесь вообще ни при чем. Да, привязка выполняется в т.ч. на этапе создания объекта, но она может изменяться при измении свойств модели, поддерживающей INotifyPropertyChanged, либо если изменяющееся привязанное свойство само по себе является DependencyProperty - такое часто бывает в ControlTemplate'ах, когда внутри шаблона свойства одних контролов привязывают к свойствам других.
...
Рейтинг: 0 / 0
Canvas + ListView
    #39889529
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Сон Веры Павловны#22016762]
авторЕсли тип данных привязанного значения совпадает с типом DependencyProperty, к которому сделана привязка, либо допускает неявную конвертацию в тип DependencyProperty, то конвертер не нужен.
Я просто раньше так не делал, я всегда писал Binding Path=....
Не знал, что можно так отдельно писать Path
авторOnCreate здесь вообще ни при чем. Да, привязка выполняется в т.ч. на этапе создания объекта, но она может изменяться при измении свойств модели, поддерживающей INotifyPropertyChanged
Мне это по сути и нужно - привязать некоторый код к WPF на этапе создания строки ListView. Понятно, что конвертер будет работать при изменении свойств и обновлять представление.
Благодарю!
...
Рейтинг: 0 / 0
Canvas + ListView
    #39889571
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений, Екатеринбург
Я просто раньше так не делал, я всегда писал Binding Path=....
Не знал, что можно так отдельно писать Path

Здесь возможны два варианта:
1)
Код: xml
1.
2.
3.
<Foo
  Bar="{Binding Zot, ..."
  />


-здесь просто опущено ключевое слово Path, и приведенный код равносилен Binding Path=Zot. Надо сказать, что в ряде случаев это ключевое слово обязательно - например, при биндинге к свойству объекта, возвращаемого из attached property:
Код: xml
1.
2.
3.
4.
5.
<Expander
  attached:DataGridUtils.BindExpandState="True"
  IsExpanded="{Binding RelativeSource={RelativeSource Self},
    Path=(attached:DataGridUtils.Expander).IsExpanded,
    Mode=TwoWay}">


- если указать свойство без указания ключевого слова Path, то ошибки не будет, но и биндинг просто не будет работать.

2) То, что было приведено выше Романом - биндинг к Path.Data. Здесь у Binding Path не указан потому, что его нет, т.к. свойство Data связывается со всем имеющимся датаконтекстом. Аналог такой записи - "{Binding .}" или "{Binding Path=.}":
Код: xml
1.
<TextBlock Text="{Binding}" />


Код: c#
1.
2.
3.
4.
5.
public MainWindow()
{
  InitializeComponent();
  DataContext = "Мама мыла раму";
}


- текстблок отобразит текст, заданный как DataContext.
...
Рейтинг: 0 / 0
Canvas + ListView
    #39889606
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я еще поддерживается индексатор
по этому такая запись будет так же правильной

"{Binding [MyItem1]}" или "{Binding [0]}"
Но плохо, что обновить данные из источника в элементу управления можно только для всех элементов индекса одновременно
...
Рейтинг: 0 / 0
Canvas + ListView
    #39889985
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поясните еще пож про отличия Geometry объектов.
Почему работает
Код: c#
1.
2.
3.
Geometry geometry = new EllipseGeometry(new Point(50, 50), 45, 20);
geometry.Freeze();
return geometry;


Но не работает
Код: c#
1.
2.
3.
4.
5.
6.
Ellipse centerEllipse = new Ellipse();
centerEllipse.Width = 50;
centerEllipse.Height = 30;
centerEllipse.Fill = Brushes.Red;
centerEllipse.Opacity = 1;
return centerEllipse;


И с канвасом точно так же - не работает.
У меня уже есть функция, которая необходимые элементы рисует на канвасе, хотелось бы использовать ее.
...
Рейтинг: 0 / 0
Canvas + ListView
    #39889987
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался, объект Path имеет свойство Data, которое может принимать только объект типа Geometry. Видимо придется переделывать.
...
Рейтинг: 0 / 0
Canvas + ListView
    #39889994
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получилось обернуть в ScrollViewer
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Canvas + ListView
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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