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

Свойство зависимости не работает в геометрии в шаблоне управления

У меня есть DepencencyProperty (логическое значение), которое отлично работает с эллипсами, но не с ArcSegment. Я делаю что-то невозможное? Вот часть xaml. Обе привязки TemplateBindings Origin и LargeArc не работают в геометрии. Но LargeArc DependencyProperty действительно работает в Эллипсе, поэтому мое DependencyProperty, кажется, настроено правильно.

 <ControlTemplate TargetType="{x:Type nodes:TestCircle}">
     <Canvas Background="AliceBlue">
         <Ellipse Height="10" Width="10" Fill="Yellow" Visibility="{TemplateBinding LargeArc, Converter={StaticResource BoolToVisConverter}}"/>
         <Path Canvas.Left="0" Canvas.Top="0" Stroke="Black" StrokeThickness="3">
             <Path.Data>
                 <GeometryGroup>
                     <PathGeometry>
                         <PathFigure IsClosed="True" StartPoint="{TemplateBinding Origin}">
                             <LineSegment Point="150,100" />
                             <ArcSegment Point="140,150" IsLargeArc="{TemplateBinding LargeArc}" Size="50,50" SweepDirection="Clockwise"/>
                         </PathFigure>
                     </PathGeometry>
                 </GeometryGroup>
             </Path.Data>
         </Path>
     </Canvas>
 </ControlTemplate>

То, что я пытаюсь построить, представляет собой (своего рода) пользовательский элемент управления в форме круга, где форма пирога определяется DependencyProperties, а фактическая используемая графика находится в шаблоне, поэтому их можно заменить или настроить. Другими словами: я хотел бы, чтобы код программной части был свободен от визуальных эффектов (что, как я полагаю, является хорошим разделением).

РЕШЕНИЕ--------------------------(Мне пока не разрешено отвечать на мои собственные вопросы)

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

Привязка TemplateBinding будет работать только при привязке DependencyProperty к другому DependencyProperty.

Следующая статья направила меня на правильный путь: http://blogs.msdn.com/b/liviuc/archive/2009/12/14/wpf-templatebinding-vs-relativesource-templatedparent.aspx

Свойства ArcSegment не являются DependencyProperties. Таким образом, решение вышеуказанной проблемы заключается в замене

<ArcSegment Point="140,150" IsLargeArc="{TemplateBinding LargeArc}"

с участием

<ArcSegment Point="140,150" IsLargeArc="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=LargeArc}"

Колин, твой рабочий пример, когда в геометрии использовалась «обычная» привязка, навел меня на правильный путь. Кстати, вам нравится инфографика и конструкция вашего UserControl в вашем блоге. И, эй, этот краткий совет по фрагментам кода, особенно по этому атрибуту DP и разделению этих DP на файл частичного класса — чистое золото!


Ответы:


1

Это должно работать. Хотя я не вижу непосредственной проблемы, я просто подумал, что хотел бы указать, что я написал статью, которая включала реализацию формы пирога в Silverlight:

Построение круговых графиков отношений с помощью Silverlight

XAML для этой формы показан ниже:

<Style TargetType="local:NodeSegment">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="local:NodeSegment"> 
          <Path Stroke="{TemplateBinding Stroke}"
                StrokeThickness="{TemplateBinding StrokeThickness}"
                Fill="{TemplateBinding Background}"
                DataContext="{Binding ViewModel}"
                x:Name="segmentShape">
            <Path.Data>
              <PathGeometry>
                <PathFigure StartPoint="{Binding Path=S1}"
                            IsClosed="True">
                  <ArcSegment Point="{Binding Path=S2}"
                              SweepDirection="Counterclockwise"
                              IsLargeArc="{Binding Path=IsLargeArc}"
                              Size="{Binding Path=OuterSize}"/>
                  <LineSegment Point="{Binding Path=S3}"/>
                  <ArcSegment Point="{Binding Path=S4}"
                              SweepDirection="Clockwise"
                              IsLargeArc="{Binding Path=IsLargeArc}"
                              Size="{Binding Path=InnerSize}"/>
                </PathFigure>
              </PathGeometry>
            </Path.Data>
          </Path>                      
        </Canvas>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>
03.04.2012
  • Спасибо за ответ - это обнадеживает, что я на правильном пути. Потом проверю на ошибки. А... Я вижу, вы используете Binding внутри PathGeometry при использовании TemplateBinding на уровне Path... Я также рассмотрю эту возможность. Я не эксперт WPF, но я предполагаю, что привязки указывают на данные в DataContext, то есть на объект ViewModel? 04.04.2012
  • Обычная привязка вместо TemplateBinding делает это! См. описание полного решения выше, в вопросе. 04.04.2012
  • Новые материалы

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

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

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

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

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

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

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