Nano Hash - криптовалюты, майнинг, программирование

Установка zindex для прямоугольника на холсте не выводит его на передний план

У меня проблема с холстом и нарисованными на нем прямоугольниками. Они получают события в обратном порядке создания (самые новые сверху), а не в порядке zindex...

У меня ItemsControl привязан к списку ресурсов.

Затем есть холст как панель элементов:

<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <Canvas x:Name="BitmapCanvas"/>
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

Все ресурсы связаны прямоугольниками:

<ItemsControl.ItemTemplate>
    <DataTemplate DataType="interfaces:IResourceView">
        <Rectangle ...>

и есть стиль:

<Rectangle.Style>
    <Style TargetType="{x:Type Rectangle}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsSelected}" Value="true">
                <Setter Property="Canvas.ZIndex" Value="0"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=IsSelected}" Value="false">
                <Setter Property="Canvas.ZIndex" Value="15"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
    ...</Rectangle.Style></Rectangle></DataTemplate></ItemsControl.ItemTemplate>

Как видите, когда прямоугольник выделен, я устанавливаю его Zindex равным 0, а у других значение Zindex больше. Я пробовал это также с поменявшимися значениями, но все равно прямоугольники получают фокус таким же образом. У кого-нибудь есть идея, почему это происходит так?

23.01.2013

  • Не уверен, что это связано, но мне интересно, почему у вас есть свой стиль в Rectangle.Style, а не в ItemsControl.Resources или в каком-либо другом теге ресурсов выше по дереву. 24.01.2013
  • Это мой собственный класс Rectangle, который реализует INotifyPropertyChanged. Лучше всего в этой проблеме то, что этот ZIndex настроен правильно. Я регистрирую это, когда возникает событие MouseMove. 24.01.2013
  • О, я вижу, что ты сейчас делаешь. 24.01.2013
  • Связанное свойство IsSelected взято из IResourceView. Rectangle взят из windows.shapes. Мой собственный класс Rectangle с INotifyPropertyChanged скрыт в IResourceView;) Все стили работают, в триггере данных, который проверяет истинное значение, есть и другие сеттеры, которые тоже работают правильно... 24.01.2013
  • Я уверен, что вы уже сделали это, но проверили ли вы, что запускаете NotifyPropertyChanged всякий раз, когда установлено свойство IsSelected (при условии, что IsSelected определен в вашем пользовательском прямоугольнике, т.е. If (PropertyChanged!=null) PropertyChanged(this, new PropertyChangedEventArgs("IsSelected"); 24.01.2013

Ответы:


1

Настройка Canvas.ZIndex (или фактически Panel.ZIndex в WPF) для Rectangle в DataTemplate не имеет никакого эффекта, так как эти Rectangle не являются прямыми дочерними элементами Canvas в ItemsPanelTemplate. Другими словами, прямоугольники не являются братьями и сестрами, но ZIndex является относительным значением, которое влияет только на братьев и сестер одного и того же элемента управления контейнером.

На самом деле каждый прямоугольник помещается в Content ContentPresenter (который является типом контейнера элемента ItemsControl). Затем эти ContentPresenter помещаются в Canvas.

Чтобы все заработало, вы можете переместить DataTriggers в Стиль контейнера элемента:

<ItemsControl.ItemContainerStyle>
    <Style TargetType="ContentPresenter">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsSelected}" Value="true">
                <Setter Property="Panel.ZIndex" Value="0"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=IsSelected}" Value="false">
                <Setter Property="Panel.ZIndex" Value="15"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ItemsControl.ItemContainerStyle>
23.01.2013
  • Однако ваши значения ZIndex предполагают, что выбранный элемент должен быть позади других, поскольку 0 меньше 15. 24.01.2013

  • 2

    Ваша проблема связана с вашими триггерами. Стиль поддерживает только EventTrigger, а не любой другой тип, поэтому ваши триггеры никогда не будут выполнены. Однако вы находитесь в DataTemplate, и они поддерживают DataTrigger, поэтому вы можете переместить некоторые вещи, чтобы решить проблему:

    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Rectangle x:Name="Rect"/>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=IsSelected}" Value="true">
                    <Setter TargetName="Rect" Property="Canvas.ZIndex" Value="0"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=IsSelected}" Value="false">
                    <Setter TargetName="Rect" Property="Canvas.ZIndex" Value="15"/>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    
    23.01.2013
  • ZIndex по-прежнему будет неэффективным, если он установлен на прямоугольнике. Он должен быть установлен в ContentPresenter. 24.01.2013
  • И DataTrigger по-прежнему не будет работать в стиле, независимо от того, какой тип вы установите. 24.01.2013
  • Стиль @JohnBowen поддерживает только EventTrigger. Откуда вы это взяли? Возможно, какая-то старая версия WPF? 24.01.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..