none
请问如何让Grid的第二列自动填满剩余空间? RRS feed

  • 问题

  • 代码如下:

    (ListBox里面插入一个Grid作为ListItem,Grid分两列,第一列宽度固定,我希望第二列能够自动占满剩余的空间。可是不知道为何不行,第二列的宽度是随着内容增减的,这就导致文本多了之后无法折行,因为TextBlock必须设置明确的宽度之后才会折行)

    我不希望给TextBlock设置固定宽度,因为窗口大小可以调整。

        <ListBox>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="120*"></ColumnDefinition>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Image Grid.Column="0" Source="fullbox_desk_clear.png" HorizontalAlignment="Left" VerticalAlignment="Top"></Image>
                <StackPanel Grid.Column="1" Margin="5 5 5 5">
                    <TextBlock VerticalAlignment="Top" HorizontalAlignment="Center" Style="{StaticResource TitleBox}">这里是标题很长很长的标题</TextBlock>
                    <TextBlock TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Center" Style="{StaticResource TextContentBox}">这里是标题很长很长的标题这里是标题很长很长的标题这里是标题很长很长的标题这里是标题很长很长的标题这里是标题很长很长的标题这里是标题很长很长的标题</TextBlock>
                </StackPanel>
            </Grid>
        </ListBox>


    da jia hao!

    2017年6月16日 11:02

全部回复

  • 你好,

    尝试设置列宽位Auto.

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

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年6月18日 7:35
    版主
  • 不行的。没有效果。

    而且,从设计器就可以看出,grid放在window里面的时候,会自动填充整个window,可是如果放在listboxitem里面,就不会自动填充,必须明确设置width和height


    da jia hao!

    2017年6月19日 7:18
  • Hi,

    你应该给Grid一个宽度,这样当TextBlock文本显示超过这个宽度之后就会自动换行。下面是我的测试代码:

     <ListBox x:Name="MyListBox" ItemsSource="{Binding}" BorderBrush="Transparent" 
         Grid.IsSharedSizeScope="True"
         HorizontalContentAlignment="Stretch">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Width="600">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="50" SharedSizeGroup="Key" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <Image Grid.Column="0" Source="/Images/China.jpg" HorizontalAlignment="Left" VerticalAlignment="Top" Stretch="Fill"/>
                        <StackPanel Grid.Column="1" >
                            <TextBlock Background="AliceBlue" Text="{Binding ShortTitle}" FontSize="20" FontWeight="Bold" VerticalAlignment="Top" HorizontalAlignment="Center" />
                            <TextBlock Background="AliceBlue" Text="{Binding LargeTitle }" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Center"/>
                        </StackPanel>
                      
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
     private ObservableCollection<Person> MyListBoxData = new ObservableCollection<Person>();
            public sample1()
            {
                InitializeComponent();
    
                MyListBoxData.Add(new Person()
                {
                    ShortTitle = "这里是标题很长很长的标题",
                    LargeTitle = "这里是标题很长很长的标题这里是标题很长很长的标题这里是标题很长很长的标题这里是标题很长很长的标题这里是标题很长很长的标题这里是标题很长很长的标题",
                });
    
                MyListBoxData.Add(new Person()
                {
                    ShortTitle = "这里是标题很长很长的标题",
                    LargeTitle = "这里是标题很长很长的标题这里是标题很长很长的标题这里是标题很长很长的标题这里是标题很长很长的标题这里是标题很长很长的标题这里是标题很长很长的标题",
                });
    
                MyListBox.ItemsSource = MyListBoxData;
    
            }
    
            public class Person
            {
                public string ShortTitle
                {
                    get;
                    set;
                }
    
                public string LargeTitle
                {
                    get;
                    set;
                }
            }
        }


    希望对你有帮助。

    Best Regards,

    Bob


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年6月19日 7:58
    版主
  • 固定宽度不行的啊。

    我的window允许用户改变大小,当window大小改变时,listbox大小也会随着改变,我希望ListBoxItem也能够随着ListBox的大小改变而改变,而不是固定一个宽度。

    不知道你是否注意到,grid放在window里面会自动填充整个客户区,但是放在ListBoxItem里面就不会,这是为什么?


    da jia hao!

    2017年7月5日 6:54