Silverlight - динамически добавляйте эллипсы на холст с помощью MVVM - PullRequest
3 голосов
/ 19 августа 2010

Я хочу добавить динамическое число эллипсов к холсту и установить позицию эллипса (canvas.top, canvas.left). Я попытался привязать к ItemsControl, но каждый элемент (эллипс) имеет контейнер, поэтому я не могу установить положение эллипса напрямую. Я не хочу контейнер для предметов, я просто хочу холст, содержащий эллипсы.

Можно ли это сделать?

Ответы [ 2 ]

2 голосов
/ 19 августа 2010

Попробуйте это - сработало для меня - я использую его, чтобы свободно размещать текстовые блоки на холсте.

Re: Re: Позиционирование элементов, когда Canvas является панелью ItemsPontel ItemsControl 02-26-20107:17 |

Существует альтернативное более простое решение, которое работает в silverlight 3.

 
 <Canvas>
  <ItemsControl ItemsSource={Binding MyItems}>
    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <Canvas>
          <TextBlock Canvas.Left={Binding Left} Canvas.Top={Binding Top} Text={Binding Text} />
        </Canvas>
      </DataTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</Canvas>

Если MyItems - это список элементов, принадлежащих к классу, у которого есть Left, Top и Text публичные свойства, это отлично работает.Я также проверил с помощью Line и Border, чтобы нарисовать простую графику в виде гистограммы в Silverlight 3.

Из нижней части этого поста: http://forums.silverlight.net/forums/p/29753/450510.aspx#450510

Объедините его с Silverlight DataTemplateSelectorВы можете изменить нарисованные объекты на основе свойств модели вида:

http://www.codeproject.com/KB/silverlight/SLTemplateSelector.aspx

2 голосов
/ 19 августа 2010

Обычно я бы сказал, использовать ItemsControl в сочетании с Canvas:

<ItemsControl ItemsSource="{Binding Ellipses}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemsContainerStyle>
        <Style>
            <Setter Property="Canvas.Left" Value="{Binding Left}"/>
            <Setter Property="Canvas.Top" Value="{Binding Top}"/>
        </Style>
    </ItemsControl.ItemsContainerStyle>
</ItemsControl>

Но при отображении присущей Silverlight свойства ItemContainerStyle не работает на ItemsControl. Он имеет поддержку в ItemsControl, но не выставляется самим ItemsControl. Вместо этого это до подклассов ItemsControl - таких как ListBox - чтобы выставить это. Да, и эти подклассы должны быть предоставлены Microsoft, потому что функциональность protected internal, поэтому вы не можете просто подкласс ItemsControl и разоблачить этот материал самостоятельно. : S

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...