Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Использование в ListBox.ItemsPanel панели Canvas  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Использовал в ItemsPanel панели WrapPanel, StackPanel. Всё было гладко ни каких проблем. Попытался с Canvas также сделать - полный тупик. Как можно Canvas использовать?
        <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>
12 янв 19, 11:11    [21783510]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3171
Eld Hasp,

В канвасе без координат объекты имеют координаты 0,0,0,0, надо определить координаты и размеры объектов через measure arrange
12 янв 19, 12:24    [21783535]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Roman Mejtes, я же задаю Canvas.Left...
Рассчитываю, для этого примера, что каждый элемент будет сдвигаться на указанную позицию...
А размеры Border, как я думал, должен принять в соответствии с содержимым.
Или по иному, это всё делать надо?
12 янв 19, 13:46    [21783571]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Eld Hasp
Или по иному, это всё делать надо?
Немножко по иному
    <ListBox.ItemContainerStyle>
      <Style TargetType="ListBoxItem">
        <Setter Property="Canvas.Left" Value="{Binding PropInt}">
        </Setter>
      </Style>
    </ListBox.ItemContainerStyle>
12 янв 19, 14:52    [21783600]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Ну точнее полностью можно так
    <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
12 янв 19, 14:54    [21783602]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Shocker.Pro
Но я бы не стал менять Template для ListBox.ItemContainerStyle - зачем? Просто надо сделать шаблон для local:SmallExampClass
вот так
  <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>
12 янв 19, 14:56    [21783604]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
На будущее - давай код, который можно сразу запускать (в данном случае пришлось воссоздавать класс local:SmallExampClass, не долго, но всё же)
12 янв 19, 14:57    [21783606]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro, СПАСИБО!
Вот я тупанул! И главное, стоко времени потратил, но сам так и не смог сообразить, что просто не то позиционирую!
12 янв 19, 14:59    [21783608]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
На будущее - давай код, который можно сразу запускать (в данном случае пришлось воссоздавать класс local:SmallExampClass, не долго, но всё же)
Да, учту - моя оплошность.
Ещё раз, СПАСИБО!
12 янв 19, 15:00    [21783610]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
Shocker.Pro
Но я бы не стал менять Template для ListBox.ItemContainerStyle - зачем? Просто надо сделать шаблон для local:SmallExampClass
вот так
Пробовал, но самому сообразить это не получилось.
    <ListBox.ItemContainerStyle>
      <Style TargetType="ListBoxItem">
        <Setter Property="Canvas.Left" Value="{Binding PropInt}" />
      </Style>
12 янв 19, 22:04    [21783818]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Эээээ..... это вопрос? или о чём?
12 янв 19, 22:34    [21783831]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
Эээээ..... это вопрос? или о чём?
Нет. Не вопрос. Объяснил, до чего без Вашей помощи не смог додуматься.
13 янв 19, 08:14    [21783921]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
Эээээ..... это вопрос? или о чём?
появился вопрос!
Как я понял, Border располагается не в панели, а в ControlTemplate.
Поэтому указание на позицию Border в панели игнорируется.
Зачем тогда в шаблоне данных указывать Canvas.Left="{Binding PropInt}" ?

И второй вопрос, для отображения списка элементов в Canvas, использование ListBox - нормальный подход?
Или есть лучшие варианты?
13 янв 19, 09:05    [21783925]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Может лучше напрямую как-то Canvas использовать? Но в панелях нет шаблонов....,вроде бы.
13 янв 19, 09:24    [21783926]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Eld Hasp
Зачем тогда в шаблоне данных указывать Canvas.Left="{Binding PropInt}" ?
Забыл выпилить
Eld Hasp
И второй вопрос, для отображения списка элементов в Canvas, использование ListBox - нормальный подход?
Ну именно ListBox смысла нет, используй ItemsControl

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

Рассматривай ItemsControl как оболочку для произвольной панели, которая поддерживает IEnumerable обычных объектов. Когда такой функционал не требуется, тогда используешь панель напрямую без оболочки
13 янв 19, 16:10    [21784053]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Shocker.Pro
Ну именно ListBox смысла нет, используй ItemsControl
А, ну если нужно выделение элементов, тогда ListBox - да
13 янв 19, 16:17    [21784058]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
Shocker.Pro
Ну именно ListBox смысла нет, используй ItemsControl
А, ну если нужно выделение элементов, тогда ListBox - да
Да, выделение нужно.
А как быть если несколько типов элементов?
Как DataTemplate настроить на вывод разных фигур?
Или надо UC делать?
13 янв 19, 22:26    [21784286]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Так же, как и в моем примере.
    <ListBox.Resources>
      <DataTemplate DataType="{x:Type local:SmallExampClass}">
добавить в ресурсы листбокса все шаблоны элементов, которые используются в списке.

А если эти элементы используются в разных местах, можно добавить шаблоны в ресурсы окна или вообще приложения (app.xaml)
13 янв 19, 22:52    [21784314]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
Так же, как и в моем примере.
    <ListBox.Resources>
      <DataTemplate DataType="{x:Type local:SmallExampClass}">
добавить в ресурсы листбокса все шаблоны элементов, которые используются в списке.

А если эти элементы используются в разных местах, можно добавить шаблоны в ресурсы окна или вообще приложения (app.xaml)

Не всё понял.
Допустим как сделать всё в ресурсах ListBox понятно:
ViewModel
    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
<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>
Окно
<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, вроде же, не наследуются?
15 янв 19, 20:35    [21786166]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Про наследование не очень понял, что имеется ввиду.
В данном случае надо:
а) убрать ресурсы из ListBox
б) в MyDictionary.xaml у ресурсов удалить ключи (x:Key="RectangleTemplate" и x:Key="CircleTemplate")
15 янв 19, 20:53    [21786177]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
Про наследование не очень понял, что имеется ввиду.
В данном случае надо:
а) убрать ресурсы из ListBox
б) в MyDictionary.xaml у ресурсов удалить ключи (x:Key="RectangleTemplate" и x:Key="CircleTemplate")
Как по умолчанию использовать я понял. Но есть ли, возможность выбирать по ключам как для стилей?
Допустим, для одного типа есть несколько представлений. Как можно указать какое-именно из них использовать?
Для стилей, в таком случае, можно указать в ресурсах стиль по умолчанию наследуемый от стиля с ключом. А как быть с DataTemplete?
15 янв 19, 21:31    [21786203]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
А, я, наконец, понял вопрос.
Ну тут два варианта, на мой взгляд. Можно написать свой TemplateSelector, а можно, в принципе и DataTemplate наследовать, что-то типа

      <DataTemplate DataType="{x:Type local:RectangleClass}">
        <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{StaticResource RectangleTemplate}" />
      </DataTemplate>
15 янв 19, 22:31    [21786236]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Но в принципе, я еще ни разу не столкнулся с ситуацией, когда для одного класса существуют принципиально разные шаблоны (хотя и не утверждаю, что такого не может быть в какой-то ситуации). А с другой стороны опять же ничто не мешает делать наследование классов на стороне модели, то есть даже класс-пустышку в общем случае, для которого существует отдельный шаблон.
15 янв 19, 22:34    [21786240]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Shocker.Pro
то есть даже класс-пустышку в общем случае, для которого существует отдельный шаблон.
... скажем, базовый абстрактный класс с основным функционалом и несколько пустых наследников по числу необходимых шаблонов
15 янв 19, 22:36    [21786242]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Eld Hasp
Member

Откуда:
Сообщений: 178
Shocker.Pro
Но в принципе, я еще ни разу не столкнулся с ситуацией, когда для одного класса существуют принципиально разные шаблоны (хотя и не утверждаю, что такого не может быть в какой-то ситуации). А с другой стороны опять же ничто не мешает делать наследование классов на стороне модели, то есть даже класс-пустышку в общем случае, для которого существует отдельный шаблон.
Такой пример - откуда у меня возник вопрос.
В ListView для класса одно представление удобное для списка. Выбранный элемент отображается в другом - более полном и удобном для редактирования.

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

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

Если вернуться к началу темы. Для DataTemplate не существует каких-то триггеров, селекторов (или чего-то подобного) позволяющего изменить представление или переключаться между ними?
16 янв 19, 00:00    [21786292]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19959
Eld Hasp
Ещё вариант, до которого сам додумался, сделать один класс для всего со всеми свойствами наследников. И в нём ввести свойство переключающее представление. По этому свойству менять Visibility у элементов в шаблоне. Но это порождает множество элементов, пусть и невидимых. Не слишком ли криво это?
Я поэтому и сказал выше буквально следующее "когда для одного класса существуют принципиально разные шаблоны". А в случае, когда разница между шаблонами в паре [не]видимых элементов, то это как раз и решается триггерами или тупым маппингом свойства Visibility на какое-то поле модели.

Eld Hasp
Если вернуться к началу темы. Для DataTemplate не существует каких-то триггеров, селекторов (или чего-то подобного) позволяющего изменить представление или переключаться между ними?
а) в качестве внешнего селектора, как я сказал, можно использовать TemplateSelector
б) можно переключать триггерами шаблон в ContentPresentere
в) можно реализовать внутри шаблона примерно такую разметку
<Grid>
  <Border Visibility="{Binding...}">
    ...
  </Border>
  <Border Visibility="{Binding...}">
    ...
  </Border>
  <Border Visibility="{Binding...}">
    ...
  </Border>
</Grid>
в общем, решается по месту
16 янв 19, 00:09    [21786304]     Ответить | Цитировать Сообщить модератору
 Re: Использование в ListBox.ItemsPanel панели Canvas  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3171
сделайте свою панель с блекджеком и всем остальным и реализуйте там логику размещения элементов так, как вашей душе угодно, без всякого гемороя
это только пример, не стоит брать его за основу, Measure не бесконечные размеры, то есть эта панель не будет работать в scrollviewer'е и т.д.
Создайте свою панель и элемент контейнер который будет в ней размещаться, свяжите свойства контейнера с моделью, переопределите метод генерации контейнера в ListBox.
Это будет самый гибкий вариант и чуть более затратный, но не более того.

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);
        }
    }
}

<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>
16 янв 19, 12:19    [21786573]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / WPF, Silverlight Ответить