powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Использование в ListBox.ItemsPanel панели Canvas
2 сообщений из 27, страница 2 из 2
Использование в ListBox.ItemsPanel панели Canvas
    #39760058
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eld HaspЕщё вариант, до которого сам додумался, сделать один класс для всего со всеми свойствами наследников. И в нём ввести свойство переключающее представление. По этому свойству менять Visibility у элементов в шаблоне. Но это порождает множество элементов, пусть и невидимых. Не слишком ли криво это?Я поэтому и сказал выше буквально следующее "когда для одного класса существуют принципиально разные шаблоны". А в случае, когда разница между шаблонами в паре [не]видимых элементов, то это как раз и решается триггерами или тупым маппингом свойства Visibility на какое-то поле модели.

Eld HaspЕсли вернуться к началу темы. Для DataTemplate не существует каких-то триггеров, селекторов (или чего-то подобного) позволяющего изменить представление или переключаться между ними?а) в качестве внешнего селектора, как я сказал, можно использовать TemplateSelector
б) можно переключать триггерами шаблон в ContentPresentere
в) можно реализовать внутри шаблона примерно такую разметку
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<Grid>
  <Border Visibility="{Binding...}">
    ...
  </Border>
  <Border Visibility="{Binding...}">
    ...
  </Border>
  <Border Visibility="{Binding...}">
    ...
  </Border>
</Grid>

в общем, решается по месту
...
Рейтинг: 0 / 0
Использование в ListBox.ItemsPanel панели Canvas
    #39760209
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделайте свою панель с блекджеком и всем остальным и реализуйте там логику размещения элементов так, как вашей душе угодно, без всякого гемороя
это только пример, не стоит брать его за основу, Measure не бесконечные размеры, то есть эта панель не будет работать в scrollviewer'е и т.д.
Создайте свою панель и элемент контейнер который будет в ней размещаться, свяжите свойства контейнера с моделью, переопределите метод генерации контейнера в ListBox.
Это будет самый гибкий вариант и чуть более затратный, но не более того.

Код: 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.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace PanelExamples
{
    public class WheelPanel : Panel
    {
        protected override void OnMouseWheel(MouseWheelEventArgs e)
        {
            if (HasAnimatedProperties)
            {
                double oldValue = Offset;
                BeginAnimation(OffsetProperty, null);
                Offset = oldValue;
            }
            Offset += 3.0 / e.Delta;
            base.OnMouseWheel(e);
        }

        public double Radius
        {
            get { return (double)GetValue(RadiusProperty); }
            set { SetValue(RadiusProperty, value); }
        }
        public static readonly DependencyProperty RadiusProperty =
            DependencyProperty.Register("Radius", typeof(double), typeof(WheelPanel), new FrameworkPropertyMetadata(100.0, FrameworkPropertyMetadataOptions.AffectsArrange));

        public double Offset
        {
            get { return (double)GetValue(OffsetProperty); }
            set { SetValue(OffsetProperty, value); }
        }
        public static readonly DependencyProperty OffsetProperty =
            DependencyProperty.Register("Offset", typeof(double), typeof(WheelPanel), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsArrange));

        protected override Size MeasureOverride(Size availableSize)
        {
            foreach (UIElement child in Children)
            {
                child.Measure(availableSize);
            }
            var resultSize = base.MeasureOverride(availableSize);
            return availableSize;
        }

        protected override Size ArrangeOverride(Size finalSize)
        {
            double centerX = finalSize.Width / 2.0;
            double centerY = finalSize.Height / 2.0;
            double step = Math.PI * 2 / Children.Count;
            double current = Offset;
            foreach (UIElement child in Children)
            {
                var x = Math.Cos(current) * Radius;
                var y = Math.Sin(current) * Radius;
                current += step;
                var size = child.DesiredSize;
                var pos = new Point(centerX + x - size.Width / 2.0, centerY + y - size.Height / 2.0);
                child.Arrange(new Rect(pos, size));
            }

            return base.ArrangeOverride(finalSize);
        }
    }
}


Код: 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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
<Window x:Class="PanelExamples.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:PanelExamples"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <ItemsControl>
            <ItemsControl.ItemsSource>
                <CompositeCollection>
                    <sys:String>Item 1</sys:String>
                    <sys:String>Item 2</sys:String>
                    <sys:String>Item 3</sys:String>
                    <sys:String>Item 4</sys:String>
                    <sys:String>Item 5</sys:String>
                    <sys:String>Item 6</sys:String>
                    <sys:String>Item 7</sys:String>
                    <sys:String>Item 8</sys:String>
                </CompositeCollection>
            </ItemsControl.ItemsSource>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <local:WheelPanel Background="Transparent" Radius="120">
                        <local:WheelPanel.Triggers>
                            <EventTrigger RoutedEvent="Loaded">
                                <EventTrigger.Actions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.TargetProperty="Offset" RepeatBehavior="Forever" From="0.0" To="6.2820" Duration="0:0:8"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger.Actions>
                            </EventTrigger>
                        </local:WheelPanel.Triggers>
                    </local:WheelPanel>
                    
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type sys:String}">
                    <Button>
                        <Button.Template>
                            <ControlTemplate TargetType="{x:Type Button}">
                                <Grid>
                                    <Ellipse x:Name="PART_Filler" Fill="{TemplateBinding Background}" Width="75" Height="75" />
                                    <TextBlock Text="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                </Grid>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter TargetName="PART_Filler" Property="Fill" Value="LightBlue"/>
                                    </Trigger>
                                             
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Button.Template>
                    </Button>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</Window>
...
Рейтинг: 0 / 0
2 сообщений из 27, страница 2 из 2
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Использование в ListBox.ItemsPanel панели Canvas
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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