Растянуть линию до ширины холста Itemstemplate в itemscontrol

#wpf #xaml #itemscontrol #itemtemplate #itemspanel

#wpf #xaml #itemscontrol #itemtemplate #itemspanel

Вопрос:

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

 <ItemsControl ItemsSource="{Binding MarkerLocations, Mode=OneTime}" HorizontalContentAlignment="Stretch">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Canvas.Top" Value="{Binding}" />
            <Setter Property="Canvas.Left" Value="0" />
            <!--Setter Property="Width" Value="{Binding Path=Width, RelativeSource={RelativeSource FindAncestor, AncestorType=Canvas, AncestorLevel=1}}"/-->
        </Style>
    </ItemsControl.ItemContainerStyle>

    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <!--Rectangle Stroke="Black" Height="2" Stretch="Fill"/-->
            <Line Stretch="Fill" X2="2" Y1="{Binding Mode=OneTime}" Y2="{Binding Mode=OneTime}" Stroke="Black" StrokeThickness="1"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
  

У меня такое чувство, что я не понимаю контекста ItemContainters.

Ответ №1:

Если вы хотите привязать к ширине растягиваемых объектов, вы должны привязать к ActualWidth :

 {Binding ActualWidth, RelativeSource={RelativeSource AncestorType=Canvas}}
  

Редактировать: Это может быть необязательно

Холсты имеют привычку вообще не занимать места, если вы им не укажете:

   <ItemsControl ItemsSource="{Binding MarkerLocations, Mode=OneTime}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas Background="Red"
                        HorizontalAlignment="Stretch"
                        VerticalAlignment="Stretch"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
  </ItemsControl>
  

Настройка его Background — это полезный прием «отладки макета», позволяющий увидеть, действительно ли он существует. Оттуда должен сработать один из ваших подходов.

Комментарии:

1. Я пробовал это, но мои ContentPresenters по-прежнему имеют фиксированную ширину 3. Ширина холста зависит от ширины окна (используя Snoop для проверки элемента управления во время его выполнения).

2. Привязка в ContainerStyle должна быть: {Binding ActualWidth, RelativeSource={RelativeSource AncestorType=Canvas}} .

3. Отлично. Мне не нужно было растягивать выравнивание, но я отмечу это как ответ, поскольку я предполагаю, что кому-то это понадобится.

4. @mydogisbox: Вы правы, была проблема с моей «рамкой», в которой я ее тестировал, соответствующим образом отредактировал свой ответ.

5. Возможно, я выкапываю старую ветку, но я делаю что-то подобное, и что меня удивляет, так это то, насколько это сложно в xaml… Я имею в виду все эти вещи <ItemContainerStyle>, почему это вообще должно быть там? Есть ли какие-нибудь хорошие руководства по этому вопросу?