首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Grid.IsSharedSizeScope在ItemsControl和ScrollViewer中的应用

Grid.IsSharedSizeScope在ItemsControl和ScrollViewer中的应用
EN

Stack Overflow用户
提问于 2019-02-28 09:40:33
回答 1查看 780关注 0票数 0

我正在简化this日志查看器。它的工作原理基本上和预期的一样,但不知怎么的,列的长度并不相同。

这是我的代码:

代码语言:javascript
复制
    <Window.Resources>
    <local:IsGreaterThanConverter x:Key="IsGreaterThanConverter" />
    <sys:Int32 x:Key="MaxDisplayLineLength">200</sys:Int32>

    <Style TargetType="ItemsControl" x:Key="LogViewerStyle">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <ScrollViewer CanContentScroll="True">
                        <ItemsPresenter/>
                    </ScrollViewer>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

        <Setter Property="ItemsPanel">
            <Setter.Value>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel IsItemsHost="True"/>
                </ItemsPanelTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <DataTemplate DataType="{x:Type logging:LogEntry}">
        <Grid IsSharedSizeScope="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition SharedSizeGroup="Date" Width="Auto"/>
                <ColumnDefinition SharedSizeGroup="Index" Width="Auto"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>

            <TextBlock Name="Date" Text="{Binding DateTime, StringFormat={}{0:yyyy.MM.dd HH:mm:ss}}" Grid.Column="0" FontWeight="Bold" Margin="5,0,5,0"/>
            <TextBlock Name="Index" Text="{Binding Index, StringFormat=({0})}" Grid.Column="1" FontWeight="Bold" Margin="0,0,2,0" TextAlignment="Left" />
            <TextBlock Name="Line" Text="{Binding Line}" Grid.Column="2" TextWrapping="NoWrap" Margin="5,0,5,0"/>

            <Grid.Style>
                <Style TargetType="Grid">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=Source}" Value="LUA">
                            <Setter Property="Grid.Background" Value="White"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Path=Source}" Value="PYTHON">
                            <Setter Property="Grid.Background" Value="LightGray"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Grid.Style>
        </Grid>

        <!--
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=Line.Length, Converter={StaticResource IsGreaterThanConverter}, ConverterParameter={StaticResource MaxDisplayLineLength}}" Value="True">
                <Setter TargetName="Line" Property="Visibility" Value="Collapsed"/>
            </DataTrigger>
        </DataTemplate.Triggers>
        -->
    </DataTemplate>
</Window.Resources>

<Grid>
    <!-- https://stackoverflow.com/a/16745054/9963147 -->
    <ItemsControl ItemsSource="{Binding LuaLog.Data, Mode=OneWay}" Style="{StaticResource LogViewerStyle}" Grid.IsSharedSizeScope="True">
        <ItemsControl.Template>
            <ControlTemplate>
                <ScrollViewer CanContentScroll="True" HorizontalScrollBarVisibility="Visible" utils:AutoScrollBehavior.AutoScroll="True">
                    <ItemsPresenter/>
                </ScrollViewer>
            </ControlTemplate>
        </ItemsControl.Template>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel IsItemsHost="True" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</Grid>

我没有找到任何与这个问题相关的帖子,可能是因为我不知道哪些控件与这个问题相关。我尝试将Grid.IsSharedSizeScope添加到以下位置:

  • 最顶网格
  • ItemsControl
  • ScrollViewer
  • ItemsPresenter

没有任何结果:

我必须在哪里添加Grid.IsSharedSizeScope才能使其工作?在类似的情况下有什么经验法则吗?

编辑:安迪的解决方案很有效。

一些向后代发出警告:它大大降低了执行速度,甚至只有100行。可能是因为空间计算。我要用固定的列宽。

解决方案如下(别忘了从ItemTemplate网格中删除ItemTemplate)

代码语言:javascript
复制
        <ItemsControl ItemsSource="{Binding LuaLog.Data, Mode=OneWay}" Style="{StaticResource LogViewerStyle}" Grid.IsSharedSizeScope="True">
        <ItemsControl.ItemTemplate>
            <DataTemplate DataType="{x:Type logging:LogEntry}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="Date" Width="Auto"/>
                        <ColumnDefinition SharedSizeGroup="Index" Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-28 10:56:39

我认为您的问题是在is控件之外定义数据板。据我所知,范围适用于控件中的所有内容。您的数据板不是,因此它可能只是“超出”范围。

当我使用共享显像管时,我总是使用项目模板或itemscontrol.resources。

我也会让你的最后一栏宽度*所以它占用了任何空间,已经结束。

无论如何,这是一些我有工作的实时标记:

代码语言:javascript
复制
<ItemsControl ItemsSource="{Binding}" Grid.IsSharedSizeScope="True"
              IsTabStop="False"
              >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="30"/>
                    <ColumnDefinition Width="40"/>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="sharedWidth"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54922513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档