Xaml 如何拉伸自定义列表框?

Xaml 如何拉伸自定义列表框?,xaml,windows-phone-8,listbox,Xaml,Windows Phone 8,Listbox,我有一个带有自定义元素的列表框,我想让它们拉伸以占据所有可用区域。这是我的密码;目前,这些项目只占用他们需要的空间,我在屏幕的左侧和右侧有一些未使用的空间。为什么? <ListBox x:Name="listBox" Margin="0,6,0,0"> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem">

我有一个带有自定义元素的列表框,我想让它们拉伸以占据所有可用区域。这是我的密码;目前,这些项目只占用他们需要的空间,我在屏幕的左侧和右侧有一些未使用的空间。为什么?

<ListBox x:Name="listBox" Margin="0,6,0,0">
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                </Style>
            </ListBox.ItemContainerStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <local:ListTemplateSelector Content="{Binding}">
                        <local:ListTemplateSelector.bloccato>
                            <DataTemplate>
                                <StackPanel Grid.Row="1">
                                    <Grid Background="Beige">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="80" />
                                            <ColumnDefinition Width="*" />
                                        </Grid.ColumnDefinitions>
                                        <Image Grid.Column="0" Source="/Assets/Images/locked.png" Width="40" Height="40" HorizontalAlignment="Left"/>
                                        <TextBlock Grid.Column="1" Text="{Binding nomePacchetto}" FontFamily="./Assets/neo-normal.ttf#NEOTERIC" FontSize="48" VerticalAlignment="Bottom" Foreground="#FF373737"/>
                                    </Grid>
                                    <Line Stroke="DarkGray" X2="400" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,6,0,6"/>
                                </StackPanel>
                            </DataTemplate>
                        </local:ListTemplateSelector.bloccato>
                        <local:ListTemplateSelector.sbloccato>
                            <DataTemplate>
                                <StackPanel Grid.Row="1">
                                    <Grid>
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="80" />
                                            <ColumnDefinition Width="*" />
                                        </Grid.ColumnDefinitions>
                                        <TextBlock Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="left" Foreground="#FF5B5B5B"><Run FontSize="32" Text="1/"/> <Run FontSize="20" Text="40"/></TextBlock>
                                        <TextBlock Grid.Column="1" Text="{Binding nomePacchetto}" FontFamily="./Assets/neo-normal.ttf#NEOTERIC" FontSize="48" VerticalAlignment="Bottom" Foreground="#FF373737"/>
                                    </Grid>
                                <Line Stroke="DarkGray" X2="400" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,6,0,6"/>
                                </StackPanel>
                            </DataTemplate>
                        </local:ListTemplateSelector.sbloccato>
                    </local:ListTemplateSelector>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

有两个属性应该可以工作,但它们不能工作HorizontalContentAlignment=Stretch VerticalContentAlignment=Stretch

要解决此问题,本示例将帮助您使用witdh:

 <ListBox x:Name="ListBoxInstance"  HorizontalAlignment="Stretch" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Background="Green" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="{Binding ActualWidth, ElementName=ListBoxInstance, Mode=OneWay}" >
                <Border Background="Red" >
                    <TextBlock Text="{Binding}"/>
                </Border>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.Items>
            <x:String>This is a test</x:String>
            <x:String>This is the second</x:String>
            <x:String>This is the thidr</x:String>
            <x:String>s</x:String>
        </ListBox.Items>
    </ListBox>
你有内容的全部宽度

在其他一些情况下,取决于平台

<ListBox.ItemContainerStyle>
  <Style TargetType="ListBoxItem">
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
  </Style>
  </ListBox.ItemContainerStyle>

有两个属性应该可以工作,但它们不能工作HorizontalContentAlignment=Stretch VerticalContentAlignment=Stretch

要解决此问题,本示例将帮助您使用witdh:

 <ListBox x:Name="ListBoxInstance"  HorizontalAlignment="Stretch" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Background="Green" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="{Binding ActualWidth, ElementName=ListBoxInstance, Mode=OneWay}" >
                <Border Background="Red" >
                    <TextBlock Text="{Binding}"/>
                </Border>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.Items>
            <x:String>This is a test</x:String>
            <x:String>This is the second</x:String>
            <x:String>This is the thidr</x:String>
            <x:String>s</x:String>
        </ListBox.Items>
    </ListBox>
你有内容的全部宽度

在其他一些情况下,取决于平台

<ListBox.ItemContainerStyle>
  <Style TargetType="ListBoxItem">
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
  </Style>
  </ListBox.ItemContainerStyle>

有两种方法可以解决此问题:

一, 最简单的方法是在datatemplate中为根网格指定固定的宽度。虽然您将提供固定宽度,但它将响应分辨率

检查此示例:

       // XAML page
       <ListBox x:Name="lbxTest" Margin="12">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Background="Blue" Width="370" >
                        <TextBlock Text="{Binding}" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
如果您这样编写代码:

List<string> lstString = new List<string>() { "string 1", "string 2", "string 3" };
lbxTest.ItemsSource = lstString;
然后,在每个分辨率480x800、720x1280、768x1280、1080x1920中,ListBox获得的大小将是相同的

检查屏幕截图以获取参考

480x800中的屏幕截图

768x1280中的屏幕截图

二, 解决此问题的另一种方法是在我们将分配给ListBox的ItemSource中添加一个参数

       <ListBox x:Name="lbxTest" Margin="12">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Background="Blue" Width="{Binding width}" >
                        <!--Width="370"-->
                        <TextBlock Text="{Binding text}" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

// code behind
public class Model
{
    public double width { get; set; }
    public string text { get; set; }
}


    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        Model m1 = new Model()
        {
            text = "string 1",
            width = lbxTest.ActualWidth
        };
        Model m2 = new Model()
        {
            text = "string 2",
            width = lbxTest.ActualWidth
        };

        List<Model> lstModel = new List<Model>();
        lstModel.Add(m1);
        lstModel.Add(m2);

        lbxTest.ItemsSource = lstModel;
    }

希望这会有帮助

有两种方法可以解决此问题:

一, 最简单的方法是在datatemplate中为根网格指定固定的宽度。虽然您将提供固定宽度,但它将响应分辨率

检查此示例:

       // XAML page
       <ListBox x:Name="lbxTest" Margin="12">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Background="Blue" Width="370" >
                        <TextBlock Text="{Binding}" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
如果您这样编写代码:

List<string> lstString = new List<string>() { "string 1", "string 2", "string 3" };
lbxTest.ItemsSource = lstString;
然后,在每个分辨率480x800、720x1280、768x1280、1080x1920中,ListBox获得的大小将是相同的

检查屏幕截图以获取参考

480x800中的屏幕截图

768x1280中的屏幕截图

二, 解决此问题的另一种方法是在我们将分配给ListBox的ItemSource中添加一个参数

       <ListBox x:Name="lbxTest" Margin="12">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Background="Blue" Width="{Binding width}" >
                        <!--Width="370"-->
                        <TextBlock Text="{Binding text}" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

// code behind
public class Model
{
    public double width { get; set; }
    public string text { get; set; }
}


    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        Model m1 = new Model()
        {
            text = "string 1",
            width = lbxTest.ActualWidth
        };
        Model m2 = new Model()
        {
            text = "string 2",
            width = lbxTest.ActualWidth
        };

        List<Model> lstModel = new List<Model>();
        lstModel.Add(m1);
        lstModel.Add(m2);

        lbxTest.ItemsSource = lstModel;
    }

希望这会有帮助

您可以阅读此答案寻求帮助:@xmashallax这与dock Panel填充剩余空间功能无关,op已明确说明剩余空间位于列表框项目的左侧和右侧。您可以阅读此答案寻求帮助:@xmashallax这与dock Panel填充剩余空间功能无关,op已明确说明剩余空间位于列表框项目的左侧和右侧。当我将此属性应用于列表元素时,它将变为空白。。。可能此时实际宽度设置为零。是的,您需要用网格替换StackPanel。这不起作用,没有StackPanel,这是我的数据模板:这有什么问题吗\是否更改了列表框HorizontalAlignment=Stretch?在这里你可以添加背景,看看它是什么样子吗?当我把这个属性应用到一个列表元素时,它会变成空白。。。可能此时实际宽度设置为零。是的,您需要用网格替换StackPanel。这不起作用,没有StackPanel,这是我的数据模板:这有什么问题吗\是否更改了列表框HorizontalAlignment=Stretch?在这里,你可以添加背景,看看它看起来如何?使用一个固定的大小修复我的问题在每个解决方案!比我想象的容易!非常感谢。使用固定大小解决了我在每个解决方案中的问题!比我想象的容易!非常感谢。