在我的应用程序中,我有一个列表框,其中包含带有文本块项的堆栈面板。文本块项目具有文本换行或文本修剪属性,以避免文本块项目滑动到可见范围之外。
据我所知,文本换行和文本修剪属性需要固定宽度才能插入换行符。出于这个原因,我为标题(宽度=“456”)和描述(宽度=“432”)设置了固定宽度:
<ListBox x:Name="CategoryList" ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="0,0,0,17">
<StackPanel>
<TextBlock
Style="{StaticResource PhoneTextLargeStyle}"
Text="{Binding Name}"
TextTrimming="WordEllipsis"
Width="456"
/>
<TextBlock
Style="{StaticResource PhoneTextSubtleStyle}"
Margin="12,-6,12,0"
Text="{Binding ContentDescription}"
TextWrapping="Wrap"
Width="432"
/>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
现在的问题是,当我转动手机时,水平模式的固定宽度太小。有没有办法根据设备宽度来取代固定宽度的宽度?
截图:
答案 0 :(得分:1)
一般来说,在XAML中使用固定宽度/高度(对于“整个”页面(100%))从来都不是一个好主意,因为XAML旨在为您完成这项工作,因此您可能专注于您的布局和技术涵盖不同屏幕和尺寸的方面。
因此,如果您使用固定宽度来显示......在整个页面上它是一个非常好的指标 出错了。
在你的情况下,你已经错误地使用了StackPanels。 StackPanels的设计方式是,它们的大小不限于其方向。这意味着,将其方向设置为水平的StackPanel可能会在宽度上不确定地增长,并且方向设置为垂直的sp的高度不会受到限制。
现在这引出了我们的问题:你在一个高度不断增长的元素(两个堆叠面板)中使用了一个宽度不断增长的元素。 即使你可能通过一些技巧限制它们的大小(例如,这可以通过一些数据绑定来实现),但这不是应该做的。
我会说 - 因为在父StackPanel中没有任何堆叠 - 用其他面板/容器替换它(或者只是删除它),你的问题就会消失。
实施例
<DataTemplate>
<!-- If you need more child elements uncomment the following line -->
<!-- <Grid> -->
<StackPanel Margin="0,0,0,17">
<TextBlock ... />
<!-- no need to set width on the following textblock -->
<TextBlock ... TextWrapping="Wrap" />
</StackPanel>
<!-- </Grid> -->
</DataTemplate>