none
UWP. как привязать grid(DataTemplate) к границам ListView?

    Вопрос

  • У меня есть шаблон данных построенный на основе грида с 4мя колонками и элементами в них. Проблема в том что не могу заставить грид растянуться на всю ширину айтема(ну и в дальнейшем вообще меняться в зависимости от размеров окна).
    18 июня 2017 г. 19:30

Все ответы

  • Тоже не нашла как это победить, если найдете отпишитесь...

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

    19 июня 2017 г. 9:15
  • У меня есть шаблон данных построенный на основе грида с 4мя колонками и элементами в них. Проблема в том что не могу заставить грид растянуться на всю ширину айтема(ну и в дальнейшем вообще меняться в зависимости от размеров окна).
    А напишите XAML для примера, а то я не очень понимаю в ем проблема. Лично я не сталкивался.

    VB.Net - WPF, UWP

    20 июня 2017 г. 4:05
    Отвечающий
  • У меня есть шаблон данных построенный на основе грида с 4мя колонками и элементами в них. Проблема в том что не могу заставить грид растянуться на всю ширину айтема(ну и в дальнейшем вообще меняться в зависимости от размеров окна).

    А напишите XAML для примера, а то я не очень понимаю в ем проблема. Лично я не сталкивался.

    VB.Net - WPF, UWP


    Вот XAML, он в двух частях, внутренняя часть ListView вынесена в контрол:
            <ListView Name="MyListMag" 
                      ItemsSource="{x:Bind SpIntMags}"
                      SelectionMode="Single"
                      RightTapped="MyListMag_RightTapped"
                      IsItemClickEnabled="True"
                      ItemClick="MyListMag_ItemClick"
                      HorizontalContentAlignment="Stretch"
                      HorizontalAlignment="Stretch"                  
                      Grid.Row="1">
                <ListView.ItemTemplate>
                    <DataTemplate x:DataType="data:SpIntMag" >
                        <local:SpListMag />
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
    
    <UserControl
        x:Class="IStore.SpListMag"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">
            <StackPanel Name="ZpIntMagList"                     
                        Margin="5" 
                        HorizontalAlignment="Stretch"
                        Background="Gold">
                <Image Source="{x:Bind SpIntMag.ImgSrc}"
                                   Margin="5"
                                   Stretch="None"
                                   HorizontalAlignment="Left"
                                   VerticalAlignment="Top"/>
                <StackPanel Margin="5" HorizontalAlignment="Stretch">
                    <TextBlock Text="{x:Bind SpIntMag.SNameMag}" TextWrapping="Wrap"/>
                    <TextBlock Text="{x:Bind SpIntMag.SSiteUrlMag}" TextWrapping="Wrap"/>
                    <TextBlock Text="{x:Bind SpIntMag.SKat}" TextWrapping="Wrap"/>
                </StackPanel>
            </StackPanel>
    </UserControl>
    А вот как получается это на экране:
    Хотелось бы чтобы весь StackPanel Name="ZpIntMagList" был на всю максимальную ширину отведенную под ListView Name="MyListMag".
    20 июня 2017 г. 11:42
  • Так как у меня в проектах все ОК, то полагаю проблема в стандартном стиле.

    попробуйте для эксперимента использовать мой стиль. если это поможет, то уже пляшите от него.

    <Style TargetType="ListViewItem">
            <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}" />
            <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}" />
            <Setter Property="Background" Value="{StaticResource StandartBackground}"/>
            <Setter Property="Foreground" Value="{StaticResource LightForeground}" />
            <Setter Property="TabNavigation" Value="Local"/>
            <Setter Property="IsHoldingEnabled" Value="True"/>
            <Setter Property="Padding" Value="12"/>
            <Setter Property="Margin"  Value="0,5,0,5"/>
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="MinWidth" Value="{ThemeResource ListViewItemMinWidth}"/>
            <Setter Property="MinHeight" Value="{ThemeResource ListViewItemMinHeight}"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListViewItem">
                        <ListViewItemPresenter Background="{StaticResource StandartBackground}" Foreground="{StaticResource LightForeground}"
                            ContentTransitions="{TemplateBinding ContentTransitions}"
                            SelectionCheckMarkVisualEnabled="True"
                            CheckBrush="{ThemeResource SystemControlForegroundBaseMediumHighBrush}"
                            CheckBoxBrush="{ThemeResource SystemControlForegroundBaseMediumHighBrush}"
                            DragBackground="{ThemeResource ListViewItemDragBackgroundThemeBrush}"
                            DragForeground="{ThemeResource ListViewItemDragForegroundThemeBrush}"
                            FocusBorderBrush="Transparent"
                            FocusSecondaryBorderBrush="Transparent"
                            PlaceholderBackground="{ThemeResource ListViewItemPlaceholderBackgroundThemeBrush}"
                            PointerOverBackground="{StaticResource StandartBackground}"
                            PointerOverForeground="{StaticResource LightForeground}"
                            SelectedBackground="{ThemeResource SystemControlHighlightListAccentLowBrush}"
                            SelectedForeground="{ThemeResource SystemControlHighlightAltBaseHighBrush}"
                            SelectedPointerOverBackground="{ThemeResource SystemControlHighlightListAccentMediumBrush}"
                            PressedBackground="{StaticResource StandartBackground}"
                            SelectedPressedBackground="{ThemeResource SystemControlHighlightListAccentHighBrush}"
                            DisabledOpacity="{ThemeResource ListViewItemDisabledThemeOpacity}"
                            DragOpacity="{ThemeResource ListViewItemDragThemeOpacity}"
                            ReorderHintOffset="{ThemeResource ListViewItemReorderHintThemeOffset}"
                            HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                            VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
                            ContentMargin="{TemplateBinding Padding}"
                            CheckMode="Inline"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    VB.Net - WPF, UWP

    20 июня 2017 г. 14:16
    Отвечающий
  • По моему, из всего этого гигансткого XAML для решения проблемы нужна только строка 

    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    20 июня 2017 г. 15:46
  • Пляски показали, что стиль можно сократить до:
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
    А как это свойство установить не прибегая к стилю?

    20 июня 2017 г. 16:04
  • Прикол в том, что у вас в вашем примере это свойство установлено на уровне контрола, но по какой то причине оно игнорируется.

    Могу сказать точно, что если смотреть стандартный шаблон темы, то там HorizontalContentAlignment задан в Left. Почему задание данного свойства на уровне контрола не перебивает его задание внутри стиля ответить затрудняюсь.

    Вывод. Лечится только заданием собственного стиля.


    VB.Net - WPF, UWP

    20 июня 2017 г. 16:40
    Отвечающий
  • А что прикольного? Свойство ListViewItem не может задаваться на уровне контрола, так как ListViewItem - динамическая штука, генерируемая на основе шаблонов. Может кто-то хочет это выравнивание сделать переменным в разных элементах списка. Соответственно, логично, что его можно задать только через стиль.


    20 июня 2017 г. 17:36
  • А что прикольного? Свойство ListViewItem не может задаваться на уровне контрола, так как ListViewItem - динамическая штука, генерируемая на основе шаблонов. Может кто-то хочет это выравнивание сделать переменным в разных элементах списка. Соответственно, логично, что его можно задать только через стиль.


    Ну да логично. На уровне контрола же установка для ListView, а не для ListViewItem. Вот что значит не коддить пол года...

    VB.Net - WPF, UWP

    20 июня 2017 г. 18:02
    Отвечающий
  • А что прикольного? Свойство ListViewItem не может задаваться на уровне контрола, так как ListViewItem - динамическая штука, генерируемая на основе шаблонов. Может кто-то хочет это выравнивание сделать переменным в разных элементах списка. Соответственно, логично, что его можно задать только через стиль.

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

    20 июня 2017 г. 21:04
  • Не обязательно глобально, можно запихать внутренний стиль в свойство ListView.ItemContainerStyle
    21 июня 2017 г. 2:57
  • Не обязательно глобально, можно запихать внутренний стиль в свойство ListView.ItemContainerStyle
    А можно пример?
    21 июня 2017 г. 5:31
  • как-то так

    <ListView.ItemContainerStyle>
       <Style TargetType="ListViewItem">
          <Setter Property="HorizontalContentAlignment" Value="Stretch"/>      
       </Style>
    </ListView.ItemContainerStyle>

    21 июня 2017 г. 6:37