С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 0
Регистрация: 05.11.2021
Сообщений: 82
1

Получение свойства Margin из элементов ItemsControl

26.10.2024, 17:16. Показов 372. Ответов 9
Метки c#, wpf (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Есть следующий код:

StepProgressBar.xaml
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
36
37
38
39
40
41
42
43
44
45
46
47
48
<Grid>
    <Rectangle Height="7" Fill="#FF00A8FF" Margin="10,0,1830,0">
 
    </Rectangle>
    <ItemsControl x:Name="Steps" ItemsSource="{Binding StepsItems}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" VerticalAlignment="Center" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
 
        <ItemsControl.ItemTemplate>
 
            <DataTemplate>
 
                <DataTemplate.Resources>
                    <Style TargetType="{x:Type Ellipse}">
                        <Setter Property="Margin" Value="10,15,0,0"/>
                    </Style>
                    <Style TargetType="{x:Type TextBlock}">
                        <Setter Property="Margin" Value="10,0,0,0"/>
                        <Setter Property="TextTrimming" Value="CharacterEllipsis"/>
                    </Style>
                </DataTemplate.Resources>
 
                <StackPanel MaxWidth="75">
                    <Grid>
                        <Ellipse x:Name="EllipseOuter"  Width="20" Height="20" Fill="{Binding OuterColor}" />
                        <Ellipse x:Name="EllipseInner"  Width="10" Height="10" Fill="{Binding InnerColor}" />
                    </Grid>
 
                    <TextBlock Text="{Binding Name}" HorizontalAlignment="Center" />
                </StackPanel>
 
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding IsCompleted}" Value="true">
                        <Setter TargetName="EllipseInner" Property="Fill" Value="{Binding CompletedColor}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding IsCompleted}" Value="false">
                        <Setter TargetName="EllipseInner" Property="Fill" Value="{Binding InnerColor}" />
                    </DataTrigger>
                </DataTemplate.Triggers>
 
 
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>
MainWindow.xaml:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Grid>
    <Canvas x:Name="PageTransitor" />
    <local:PageTransition/>
    <local:StepProgressBar x:Name="FirmwareBar" Margin="0,0,0,0">
        <local:StepProgressBar.StepsItems>
          <local:Step Name="1" OuterColor="#FF100E87"/>
          <local:Step Name="2" OuterColor="#FF0089FF" IsCompleted="False" CompletedColor="#FF0089FF"/>
          <local:Step Name="3" OuterColor="#FF0089FF" IsCompleted="False" CompletedColor="#FF0089FF"/>
          <local:Step Name="4" OuterColor="#FF0089FF" IsCompleted="False" CompletedColor="#FF0089FF"/>
        </local:StepProgressBar.StepsItems>
 
    </local:StepProgressBar>
    
</Grid>
Текущий вид контрола:
Название: Сниfggмок.PNG
Просмотров: 64

Размер: 2.8 Кб

С его помощью создаётся полоска Rectangle с ItemsControl, а отдельно в MainWindow.xaml создаётся наполнение ItemTemplate'ми. Мне необходимо, чтобы левый край полоски совпадал с положением первого элемента ItemsControl, а правый край - с положением последнего (одним словом, чтобы полоска не "вылезала" за элементы). Как я ни пытался получить Margin этих элементов, они всегда имели значение NaN.
Как можно решить эту проблему?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2024, 17:16
Ответы с готовыми решениями:

ListBox дефолтная стилистика для ItemsControl.ItemTemplate и ItemsControl.ItemsPanel
Как можно задать свою стилистику, по умолчанию, для ItemsControl.ItemsPanel и...

Свойство column свойства margin
Есть свойства: p { column-count: 4; /*Количество колонок в многоколоночном тексте*/ ...

Создание отступов текста с помощью css-свойства margin
Здравствуйте! Например, такой код: &lt;!DOCTYPE html&gt; &lt;html lang=&quot;en&quot;&gt; &lt;head&gt; ...

Вывод элементов ItemsControl в UserControl
Добрый день. Имеется UserControl с ItemsControl внутри, который в свою очередь привязан к своему...

Стороннее добавление элементов в ItemsPanel ItemsControl[a]
У ItemsControl в качестве ItemsPanel - Grid. Есть потребность добавить в этот Grid некие...

9
Модератор
Эксперт .NET
15846 / 10994 / 2852
Регистрация: 21.04.2018
Сообщений: 32,251
Записей в блоге: 2
26.10.2024, 18:18 2
Цитата Сообщение от Zero_000 Посмотреть сообщение
одним словом, чтобы полоска не "вылезала" за элементы
А причём здесь Margin?
0
2 / 2 / 0
Регистрация: 05.11.2021
Сообщений: 82
26.10.2024, 22:32  [ТС] 3
Элд Хасп
А причём здесь Margin?
Ну ведь он отвечает за отступы от краёв? Как тогда иначе можно этого добиться?

Добавлено через 2 часа 54 минуты
Смысл моей идеи заключался в том, чтобы узнать отступы от краёв первого и последнего элемента ItemsControl и такие же отступы справа и слева назначить Rectangle
0
Модератор
Эксперт .NET
15846 / 10994 / 2852
Регистрация: 21.04.2018
Сообщений: 32,251
Записей в блоге: 2
26.10.2024, 22:35 4
Цитата Сообщение от Zero_000 Посмотреть сообщение
ведь он отвечает за отступы от краёв?
Да. Margin задаёт поля вокруг элемента в выделенном для него регионе визуализации.
Но у вас StackPanel. И каким образом поле вокруг элемента позволит определить его позицию? И как она поможет потом нарисовать соединяющую линию?

Я вижу такое самое простое решение.
ItemsControl визуализирует все кружки. Вам нужно провести под ними линию от первого до последнего.
Так как кроме StackPanel в ItemsControl ничего нет, то линия должна рисоваться по всей ширине ItemsControl с отступами слево и справо достаточными чтобы не выступать из под первого и последнего элемента.
0
Эксперт JavaЭксперт по электронике
3100 / 2182 / 553
Регистрация: 04.09.2018
Сообщений: 7,436
Записей в блоге: 3
26.10.2024, 22:35 5
Цитата Сообщение от Zero_000 Посмотреть сообщение
Смысл моей идеи заключался в том, чтобы узнать отступы от краёв первого и последнего элемента ItemsControl и такие же отступы справа и слева назначить Rectangle
чем Margin тут поможет? Технически, углы у Rectangle будут выступать за окружность, даже если этого будет не различить на экране. Т.е. это костыль.
Проще полоску сдвигать в центр круглых областей. Этого точно не будет видно.
1
2337 / 1824 / 753
Регистрация: 27.07.2012
Сообщений: 5,398
26.10.2024, 22:37 6
Цитата Сообщение от Zero_000 Посмотреть сообщение
Смысл моей идеи заключался в том, чтобы узнать отступы от краёв первого и последнего элемента ItemsControl и такие же отступы справа и слева назначить Rectangle
Можно добавить в привязанную коллекцию элементы, которые будут отвечать за соединители и пропуски.
1
Модератор
Эксперт .NET
15846 / 10994 / 2852
Регистрация: 21.04.2018
Сообщений: 32,251
Записей в блоге: 2
26.10.2024, 22:38 7
Лучший ответ Сообщение было отмечено Zero_000 как решение

Решение

По вашему коду отступы будут 20.
XML
1
2
3
4
<Grid HorizontalAlignment="Left">
    <Rectangle Height="7" Fill="#FF00A8FF" Margin="20 0"  VerticalAlignment="Center"/>
 
    <ItemsControl x:Name="Steps" ItemsSource="{Binding StepsItems}">
0
2 / 2 / 0
Регистрация: 05.11.2021
Сообщений: 82
26.10.2024, 22:54  [ТС] 8
Цитата Сообщение от Элд Хасп Посмотреть сообщение
По вашему коду отступы будут 20.
В таком случае, при левом выравнивании, размещать сам контрол в пространстве окна уже при помощи Margin, я верно понимаю?
0
Модератор
Эксперт .NET
15846 / 10994 / 2852
Регистрация: 21.04.2018
Сообщений: 32,251
Записей в блоге: 2
26.10.2024, 23:03 9
Цитата Сообщение от Zero_000 Посмотреть сообщение
В таком случае, при левом выравнивании, размещать сам контрол в пространстве окна уже при помощи Margin, я верно понимаю?
У вас же "ручная" разметка.
Поэтому при изменении разметки нужно изменять "руками" и линию.

Если делать в общем виде, то согласен с wizard41.
Нужно определять центры первого и последнего. Потом по этим данным строить линию.
Но в этом случае не так просто определить что такое "последний". Ведь в общем случае последовательность в ItemsSource далеко не обязательно будет соответствовать визуальной их последовательности.

Например можно добавить в local:Step свойства с помощью которого указать первый и последний элемент.
Прокидывать их на уровень ItemsControl и там уже Rectangle сможет "поймать" их центры и правильно себя отпозиционировать.
Но всё это потребует несколько десятков строк кода. Может даже за сотню перевалить.
Поэтому надо сначала вам подумать настолько вам нужно общее решение?
1
2 / 2 / 0
Регистрация: 05.11.2021
Сообщений: 82
26.10.2024, 23:07  [ТС] 10
Благодарю за совет, буду пробовать!
0
26.10.2024, 23:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2024, 23:07
Помогаю со студенческими работами здесь

CSS Не работает margin-top/margin-left в IE, Firefox
Добрый день! Проблема в коде CSS .check &gt; span{ -webkit-transition: all ease-in-out...

Margin-top и margin-bottom в ie6 не работает
#news1 &gt; p { margin-top:15px; margin-bottom:15px; } пробовал ставить !important эффект...

Получение свойства изображения
Как получить свойства фотографии: Диафрагма выдержка ISO. Фотография загружается с определенного...

Получение свойства наследуемого класса
Есть класс public class BaseClass { public int MyProp { get { return 0; } } } И есть...

Получение значение свойства объекта
Доброго времени суток, форумчане. Есть класс круг: public class Circle{ public double...

Получение свойства из родительского класса
Добрый день, помогите разобраться с ошибкой. Хочу получить значение $pdo из родительского класса в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru