Listbox обрезает кнопки по ширине [дубликат]

115
12 февраля 2021, 07:40
На этот вопрос уже дан ответ здесь:
Растянуть TextBlock на всю ячейку grid WPF (1 ответ)
Закрыт 1 год назад.

Что сделать, чтобы ListBox не обрезал кнопки по ширине?
При том, что применён margin ко всем сторонам.
Я пытался загуглить, но там вопрос был в том, что он обрезал кнопки по высоте, а не по длине.
Нужно, чтобы они все были одинаковой длины.

<Window.Resources>
        <Style x:Key="MenuButton" TargetType="Button">
            <Setter Property="Margin" Value="5"/>
            <Setter Property="Background" Value="Wheat"/>
        </Style>
    </Window.Resources>
    <Grid>
            <Menu Height="23.926" VerticalAlignment="Top" Grid.ColumnSpan="2">
                <MenuItem Header="File">
                    <MenuItem Header="New Project" ></MenuItem>
                    <MenuItem Header="Open Project" >
                        <MenuItem Header="WinForms"></MenuItem>
                        <MenuItem Header="WPF" ></MenuItem>
                    </MenuItem>
                    <Separator />
                    <MenuItem Header="Exit" ></MenuItem>
                </MenuItem>
                <MenuItem Header="Edit" ></MenuItem>
                <MenuItem Header="View" ></MenuItem>
            </Menu>
        <Grid Margin="0,20,0,0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="3*"/>
            </Grid.ColumnDefinitions>
            <ListBox x:Name="ButtonList" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <Button Style="{StaticResource MenuButton}">
                                <Button.Content>
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition/>
                                            <ColumnDefinition/>
                                        </Grid.ColumnDefinitions>
                                        <Image Source="{Binding Path=ImageR}" Width="0.5cm" Height="0.5cm" HorizontalAlignment="Left" Grid.Column="0"/>
                                        <Label Content="{Binding Path=NameR}" Grid.Column="1" HorizontalAlignment="Center"/>
                                    </Grid>
                                </Button.Content>
                            </Button>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Grid>
    </Grid>
</Window>
Answer 1

Можно установить HorizontalContentAlignment значение Stretch.

Для ListBox, чтобы растягивать StackPanel:

<ListBox x:Name="ButtonList" HorizontalContentAlignment="Stretch">

, и для Button, чтобы растягивать Grid:

<Button Style="{StaticResource MenuButton}" HorizontalContentAlignment="Stretch">

После этого наверное нужно будет поработать со столбцами Grid. Например, выровнять картинку по левому краю:

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

Похожий вопрос на en.SO: How to get a ListBox ItemTemplate to stretch horizontally the full width of the ListBox?

READ ALSO
Групировка по нескольким фильтрам

Групировка по нескольким фильтрам

Есть вот такой класс

135
Проиграть анимацию один раз

Проиграть анимацию один раз

Есть тип врага, подходя к которому, он должен выпускать в меня снаряд, соответственно должна проигрываться анимация атаки, потом задержка...

92
Отображение объекта

Отображение объекта

Есть часть кода игры типа Space Invaders:

106
C# Цикл For (при DataGridView)

C# Цикл For (при DataGridView)

Появилась проблема, есть код (ниже написан):

109