0

我正在尝试使用 WPF 替换现有 Winforms 项目的一部分。让我们称这件作品为“日志查看器”。每个日志条目都包含一个标题和一些正文。查看器应将这些显示在一个长的可滚动列表中。

原始的(Winforms)日志查看器在日志条目的数量及其大小很小的情况下运行良好,但在显示大量长条目时会遇到一些问题;WPF virtualizingstackpanel 解决了这些问题,但是 WPF,或者我缺乏使用它的经验,正在增加它自己的一些问题。

如果我在 ListBox 周围构建 logviewer 窗口,它可以完美地工作,除了滚动是按项目而不是平滑滚动“按像素”。我认为这可以通过迁移到 .Net 4.5 来解决,但这不是一个简单的选择。

或者,如果我围绕 TreeView 构建它,它可以完美滚动,但文本不会换行;相反,它每段形成一长行。

这是树视图版本的 xaml;它大量借鉴了这个 SO question,其中样式似乎用于纠正非包装问题。它滚动得很漂亮,但它仍然没有换行。

<Window x:Class="zCasesheet.wCasesheet"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:gl="clr-namespace:System.Globalization;assembly=mscorlib"

    Title="MainWindow" Height="440" Width="674">

<Window.Resources>
    <Style x:Key="MyTreeViewItemStyle" TargetType="{x:Type TreeViewItem}">
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="SnapsToDevicePixels" Value="true"/>
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="VerticalContentAlignment" Value="Stretch"/>
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TreeViewItem}">
                    <Border Name="myBorder" 
                    SnapsToDevicePixels="true" 
                    CornerRadius="0,0,0,0" 
                    VerticalAlignment="Stretch" 
                    HorizontalAlignment="Stretch"
                    BorderThickness="0"
                    BorderBrush="Transparent"
                    Height="Auto"
                    Margin="1,1,1,3" 
                    Background="Transparent">
                        <ContentPresenter Grid.Column="1" x:Name="PART_Header" HorizontalAlignment="Stretch" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" ContentSource="Header"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid Name="grCasesheet" Background="#FFF6E7C9">
    <Grid.RowDefinitions>
        <RowDefinition Height="356*" />
        <RowDefinition Height="45" />
    </Grid.RowDefinitions>
    <TreeView  HorizontalAlignment="Stretch" Margin="2,2,2,0" VerticalAlignment="Top" Name="lstNarratives"    ScrollViewer.HorizontalScrollBarVisibility="Disabled"  ScrollViewer.CanContentScroll="True"  >

        <TreeView.ItemTemplate >

            <DataTemplate >

                <Grid >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="35" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>


                    <TextBox Grid.Row="0"  Background="Honeydew" HorizontalAlignment="Stretch" BorderBrush="Black" Text="{Binding Path=HeaderText, StringFormat=d,  ConverterCulture={x:Static gl:CultureInfo.CurrentCulture} }"/>
                    <TextBlock  Grid.Row="1" TextWrapping="Wrap" HorizontalAlignment="Stretch" Text="{Binding Path=BodyText}" Margin="10,10,10,10"/>

                </Grid>

            </DataTemplate >

        </TreeView.ItemTemplate >

    </TreeView>

</Grid>

我也根据这个 SO answer尝试了 xaml ,但我也无法让它工作 - 它仍然按项目滚动。

非常感谢任何帮助。

4

0 回答 0