Я использую ItemControl, где для параметра ItemsPanel задано значение Canvas (см. этот вопрос для получения дополнительной информации). Элемент ItemsControl выполняется так, как я хочу, и он работает как шарм при добавлении дочернего элемента вручную, помещая его в ItemControl.Items:
<ItemsControl>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Items>
<Button Canvas.Left="500" Content="Button Text" />
</ItemsControl.Items>
</ItemsControl>
Обратите внимание на свойство Canvas.Left на Button. Это работает как шарм, а кнопка расположена на 500 пикселей слева от левой части ItemsControl. Отлично!
Однако, когда я определяю привязку ItemsSource к списку, Canvas.left не имеет никакого эффекта:
<ItemsControl ItemsSource="{Binding Elements}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Canvas.Left="500" Content="Button Text" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Проверяя приложение во время выполнения, я вижу одно различие. Контейнер ContentPresenter добавлен между холстом и кнопкой.
Как установить свойство Canvas.Left на ContentPresenter? Или есть другой способ решить эту проблему?
Спасибо всем!