#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>, почему это вообще должно быть там? Есть ли какие-нибудь хорошие руководства по этому вопросу?