我有一个带有ListView的Windows Phone 8.1项目,该项目的项源由后面的C#代码填充。它有效,但我最后在单行文本块之间留有空白。我试过在文本块,它位于其中的网格, ListView 本身上设置高度。我尝试通过将高度绑定(bind)到文本块的高度来设置ItemContainerStyle,但是它不起作用。
如果将TextBlock的文本设置为“实际高度”绑定(bind),则得到0,所以我一定做错了。我很确定它与ListViewItems的高度有关,但是由于它们是从代码填充的,所以我不知道如何使它们执行我想要的操作。我也尝试过为列表切换到ItemsControl,但它似乎并没有滚动和正常工作。
这是Listview的XAML:

<ListView x:Name="TheList" IsHoldingEnabled="True"
                      ItemsSource="{Binding items}"
                      Loaded="WhenListViewBaseLoaded"
                      ContinuumNavigationTransitionInfo.ExitElementContainer="True"
                      IsItemClickEnabled="True">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="Height" Value="{Binding ElementName=txtBibleText, Path=ActualHeight}"/>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid x:Name="ItemTemplateGrid" Holding="ListViewItem_Holding" Background="Blue">
                        <FlyoutBase.AttachedFlyout>
                            <MenuFlyout>
                                <MenuFlyoutItem Text="Share"
                                                Click="ShareFlyoutItem_Click" />
                                <MenuFlyoutItem Text="Add to Sharing"
                                                Click="AddSharingFlyoutItem_Click" />
                            </MenuFlyout>
                        </FlyoutBase.AttachedFlyout>
                        <Grid x:Name="gridText">
                            <TextBlock x:Name="txtBibleText"
                                   FontSize="{Binding TheFontSize}"
                                   Grid.Column="1"
                                   VerticalAlignment="Top"
                                   HorizontalAlignment="Left"
                                   TextWrapping="Wrap"
                                   Margin="0,0,0,0" FontFamily="Global User Interface">
                            <Run Text="{Binding VerseNumber}"/>
                            <Run Text="{Binding BibleText}"/>
                            </TextBlock>
                        </Grid>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

后面的代码填充了ListView:
XDocument loadedData = XDocument.Load(TranlationFilePath);
            var data = from query in loadedData.Descendants("testament").Descendants("book").Descendants("chapter").Descendants("verse")
                       where (string)query.Parent.Parent.Parent.Attribute("name") == GetTestament
                       where (string)query.Parent.Parent.Attribute("name") == GetBibleBook
                       where (string)query.Parent.Attribute("number") == GetChapter
                       select new BibleLoad
                       {
                           VerseNumber = (string)query.Attribute("number"),
                           BibleText = (string)query.Value.ToString(),
                           TheFontSize = FontSize
                       };
            TheList.ItemsSource = data;

感谢您的时间。这是我第一次发布问题,希望我做对了。我已经搜索,搜索和试验了很长时间。

编辑完XML并缩短记录后。

与关闭文字换行。

重新包装后,高度设置为20,最小高度设置为31。

MinHeight至20环绕:

最佳答案

多余的空间来自ItemContainerStyle的ListViewItem模板。默认模板不仅包含ItemTemplate的空间,还包含装饰物(例如用于标记选择的复选框)的空间。注意CheckboxContainers的矩形的高度为25.5,SelectedCheckMark的高度为34。

<Grid x:Name="CheckboxContainer">
    <Grid.RenderTransform>
        <TranslateTransform x:Name="CheckboxContainerTranslateTransform" X="{ThemeResource ListViewItemContentOffsetX}"/>
    </Grid.RenderTransform>
    <Rectangle x:Name="NormalRectangle" Fill="{ThemeResource CheckBoxBackgroundThemeBrush}" Height="25.5" Stroke="{ThemeResource CheckBoxBorderThemeBrush}" StrokeThickness="{ThemeResource CheckBoxBorderThemeThickness}" Width="25.5"/>
    <Path x:Name="CheckGlyph" Data="M0,123 L39,93 L124,164 L256,18 L295,49 L124,240 z" Fill="{ThemeResource CheckBoxForegroundThemeBrush}" FlowDirection="LeftToRight" HorizontalAlignment="Center" Height="17" IsHitTestVisible="False" Opacity="0" Stretch="Fill" StrokeThickness="2.5" StrokeLineJoin="Round" VerticalAlignment="Center" Width="18.5"/>
</Grid>


<Border x:Name="SelectedBorder" BorderBrush="{ThemeResource ListViewItemSelectedBackgroundThemeBrush}" BorderThickness="{ThemeResource GridViewItemMultiselectBorderThickness}" IsHitTestVisible="False" Opacity="0">
    <Grid x:Name="SelectedCheckMark" HorizontalAlignment="Right" Height="34" Opacity="0" VerticalAlignment="Top" Width="34">
        <Path x:Name="SelectedEarmark" Data="M0,0 L40,0 L40,40 z" Fill="{ThemeResource ListViewItemSelectedBackgroundThemeBrush}" Stretch="Fill"/>
        <Path x:Name="SelectedGlyph" Data="M0,123 L39,93 L124,164 L256,18 L295,49 L124,240 z" Fill="{ThemeResource ListViewItemCheckThemeBrush}" FlowDirection="LeftToRight" HorizontalAlignment="Right" Height="14.5" Margin="0,1,1,0" Stretch="Fill" VerticalAlignment="Top" Width="17"/>
    </Grid>
</Border>

如果您不需要选择行为,则可以将ItemContainerStyle剥离为所需的部分,这样就不必为与应用程序无关的装饰留出空间。如果您确实需要选择,则可以移动或调整选择检查的大小,以便它们适合您的设计。

您可以通过在设计器中选择ListView并右键单击并选择``编辑其他模板''来生成默认的ItemContainerStyle模板。编辑生成的项目容器(ItemContainerStyle)编辑副本...

然后,您可以根据需要编辑装饰高度。

关于c# - WPF : Set ListViewItem from textblock in the Listview within a DataTemplate,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25467913/

10-09 07:18