При использовании ItemsControl ItemsControl. ItemsPanel установлен на Холст, ContenPresenter входит, и повредите мои свойства Canvas на детях [WPF]

Я использую ItemsControl, где ItemsPanel установлен на Холст (см. этот вопрос для большей справочной информации). ItemsControl работает, как я хочу, и он работает как очарование при добавлении дочернего элемента вручную путем помещения его в ItemsControl. Объекты:


    
        
            
        
    
    
        

Отметьте Холст. Оставленное свойство на Кнопке. Это работает как очарование, и Кнопка помещается 500 пикселей от левых левой стороны ItemsControl.Отлично!

Однако, Когда я определяю привязку ItemsSource к Списку, Canvas.left не имеет никакого эффекта:


    
        
            
        
    
    
        
            

Путем осмотра приложения в течение времени выполнения я вижу одно различие. Контейнерный ContentPresenter был добавлен между Холстом и кнопкой..

Как я могу установить Холст. Оставленное свойство на самом ContentPresenter? Или есть ли другой способ решить эту проблему?

Благодаря всем!

16
задан Community 23 May 2017 в 11:51
поделиться

2 ответа

на ум приходит несколько решений:

  1. использовать layout/rendertransform вместо вложенного свойства
  2. использовать margin вместо вложенного свойства
  3. производное от ItemsControl и переопределить поведение создания дочерних контейнеров. (GetContainerForItemOverride, IsItemItsOwnContainerOverride). В этой статье хорошо объясняется, как это работает: http://drwpf.com/blog/2008/07/20/itemscontrol-g-is-for-generator/
4
ответ дан 30 November 2019 в 17:39
поделиться

Можно установить свойство Canvas.Left с помощью ItemContainerStyle:

<ItemsControl ItemsSource="{Binding Elements}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas IsItemsHost="True" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Content="Button Text" />
            </DataTemplate>     
        </ItemsControl.ItemTemplate>
    <ItemsControl.ItemContainerStyle>
        <Style>
             <Setter Property="Canvas.Left" Value="500" />
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>
25
ответ дан 30 November 2019 в 17:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: