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?在这里,你可以添加背景,看看它看起来如何?使用一个固定的大小修复我的问题在每个解决方案!比我想象的容易!非常感谢。使用固定大小解决了我在每个解决方案中的问题!比我想象的容易!非常感谢。