【问题标题】:Padding added to elements on Window 8.1-10 but not Windows 7在 Window 8.1-10 但不是 Windows 7 上的元素中添加了填充
【发布时间】:2018-04-18 16:51:34
【问题描述】:

我目前正在开发通过 ListView 显示项目层次结构的 Visual Studio 扩展。 WPF ListView 包含的项目的样式看起来好像它们是树的一部分。它们还被设计为将它们的内边距、边框粗细和边距减少到 0。

这些项目可以折叠或展开以隐藏其分配的子项。折叠和展开行为基本上包括从 ListView 中添加/删除项目以及更改 Expander 元素的状态。如果项目数量太大而无法包含在窗口中,则滚动条会根据需要显示。

想要的选择行为

大多数时候我确实得到了想要的行为。但是,有时,所有项目都会改变它们的视图,如下所示:

随机发生的随机行为

当滚动条出现或消失时,问题会不断重复,但滚动条的状态也没有任何变化。我在 VS2015Enterprise 和 VS2017 Enterprise/Professional 上试过,问题只出现在 Windows 8.1/10 上。它在 Windows 7 上运行良好。

您对可能导致添加填充/边距/边框的原因有任何想法吗?

(我已经看过不同基本样式的解决方案,为使用的元素添加默认样式并没有帮助)。

编辑:这是用于项目/树视图的样式:

<!-- Tree style -->

<Style x:Key="{x:Type custom:IssuesTreeViewInternal}" TargetType="{x:Type custom:IssuesTreeViewInternal}">
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type custom:IssuesTreeViewInternal}">
                <ScrollViewer x:Name="_tv_scrollviewer_" Focusable="False" CanContentScroll="True">
                    <ItemsPresenter />
                </ScrollViewer>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<!-- ExpandCollapseToggleStyle style -->

<Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
    <Setter Property="Focusable" Value="False" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">
                <Grid Width="15" Height="13" Background="Transparent">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CheckStates">
                            <VisualState x:Name="Checked">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="Collapsed">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Hidden}" />
                                    </ObjectAnimationUsingKeyFrames>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="Expanded">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Unchecked" />
                            <VisualState x:Name="Indeterminate" />
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Path x:Name="Collapsed" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="1,1,1,2" Data="M 4.5 0.5 L 8.5 4.5 L 4.5 8.5 Z" Stroke="{DynamicResource {x:Static vsUI:EnvironmentColors.StartPageTextDateBrushKey}}" />
                    <Path x:Name="Expanded" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="1,0,1,2" Data="M 9.5 0.5 L 9.5 5.5 L 4.5 5.5 Z" Visibility="Hidden" Stroke="{DynamicResource {x:Static vsUI:EnvironmentColors.StartPageTextDateBrushKey}}" Fill="{DynamicResource {x:Static vsUI:EnvironmentColors.StartPageTextDateBrushKey}}" />
                </Grid>
                <ControlTemplate.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="true"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Stroke" TargetName="Collapsed" Value="{DynamicResource {x:Static vsUI:EnvironmentColors.ScrollBarArrowGlyphPressedBrushKey}}" />
                        <Setter Property="Stroke" TargetName="Expanded" Value="{DynamicResource {x:Static vsUI:EnvironmentColors.ScrollBarArrowGlyphPressedBrushKey}}" />
                        <Setter Property="Fill" TargetName="Expanded" Value="{DynamicResource {x:Static vsUI:EnvironmentColors.ScrollBarArrowGlyphPressedBrushKey}}" />
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="true"/>
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Fill" TargetName="Collapsed" Value="{DynamicResource {x:Static vsUI:EnvironmentColors.StartPageTextDateBrushKey}}" />
                        <Setter Property="Fill" TargetName="Expanded" Value="Transparent" />
                    </MultiDataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<!-- TreeViewItemFocusVisual style -->

<Style x:Key="TreeViewItemFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Rectangle Margin="0" Stroke="{DynamicResource {x:Static vsUI:EnvironmentColors.SystemHighlightBrushKey}}" StrokeThickness="1" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<!-- IssuesTreeViewItem style -->
<Style x:Key="{x:Type custom:IssuesTreeViewItem}" TargetType="{x:Type custom:IssuesTreeViewItem}">
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="Padding" Value="1" />
    <Setter Property="Foreground" Value="{DynamicResource {x:Static vsUI:EnvironmentColors.ToolboxContentTextBrushKey}}" />
    <Setter Property="Focusable" Value="False" />   <!-- No need to focus on it. We can have focus on the parent ListViewItem instead. -->
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    <Setter Property="BorderThickness" Value="0" /> <!-- 0 border thickness makes sure clicking on the IssuesTreeViewItem is registered everywhere, even in the border area. -->
    <Setter Property="ToolTip" Value="{Binding Path=Content.Tooltip}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type custom:IssuesTreeViewItem}">
                <ControlTemplate.Resources>
                    <converters:LeftMarginMultiplierConverter x:Key="LeftMarginMultiplier" DefaultLength="19" />
                </ControlTemplate.Resources>
                <Border Name="Border" 
                        Background="{TemplateBinding Background}" 
                        BorderBrush="{TemplateBinding BorderBrush}" 
                        BorderThickness="{TemplateBinding BorderThickness}" 
                        Padding="{TemplateBinding Padding}">
                    <Grid Margin="{Binding Converter={StaticResource LeftMarginMultiplier}, RelativeSource={RelativeSource TemplatedParent}}">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="19" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <ToggleButton x:Name="Expander" 
                                      Style="{StaticResource ExpandCollapseToggleStyle}" 
                                      IsChecked="{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" 
                                      ClickMode="Press" 
                                      VerticalAlignment="Top" 
                                      Margin="0, 2, 0, 0" 
                                      Command="{Binding Path=ToggleButtonCommand, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}" />
                        <ContentPresenter x:Name="PART_Header" 
                                          Grid.Column="1" 
                                          Content="{Binding Content}"
                                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" />
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasChildren" Value="False">
                        <Setter TargetName="Expander" 
                                Property="Visibility" 
                                Value="Hidden" />
                    </Trigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsSelected}" Value="True" />
                            <Condition Binding="{Binding RelativeSource={RelativeSource AncestorType=Control}, Path=IsKeyboardFocusWithin}" Value="False" />
                        </MultiDataTrigger.Conditions>
                        <Setter TargetName="Border" 
                                Property="Background" 
                                Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=PassiveHighlightBrush}" />
                        <Setter TargetName="Border" 
                                Property="BorderBrush" 
                                Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=PassiveHighlightBrush}" />
                    </MultiDataTrigger>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding IsSelected}" 
                                       Value="False" />
                            <Condition Binding="{Binding Path=Content.IsSuppressed, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"
                                       Value="True" />
                        </MultiDataTrigger.Conditions>
                        <Setter Property="Foreground" 
                                Value="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource TextViewItemForegroundColorConverter}}" />
                    </MultiDataTrigger>

                    <DataTrigger Binding="{Binding IsSelected}" Value="True">
                        <Setter TargetName="Border" Property="Background" Value="{DynamicResource {x:Static vsUI:EnvironmentColors.SystemHighlightBrushKey}}" />
                        <Setter TargetName="Border" Property="BorderBrush" Value="{DynamicResource {x:Static vsUI:EnvironmentColors.SystemHighlightBrushKey}}" />
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static vsUI:EnvironmentColors.SystemHighlightTextBrushKey}}" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我们在 VS 扩展的 XAML 位中以这种方式使用 TreeView 样式:

<local:IssuesTreeViewInternal 
            x:Name="issuesTreeInternal" 
            ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
            HorizontalContentAlignment="Stretch"
            VirtualizingPanel.IsVirtualizing="True" 
            VirtualizingPanel.VirtualizationMode="Recycling" 
            SelectionMode="Extended"
            DataContext="{Binding IssuesTreeViewInternalViewModel}"
            ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=IssuesTreeItems}"
            SelectedItem="{Binding SelectedItem}"
            behaviours:MultiSelectorBehaviours.SynchronizedSelectedItems="{Binding SelectedNames}" 
            x:FieldModifier="internal">
            <local:IssuesTreeViewInternal.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="FocusVisualStyle" Value="{StaticResource TreeViewItemFocusVisual}" />
                </Style>
            </local:IssuesTreeViewInternal.ItemContainerStyle>
        </local:IssuesTreeViewInternal>

IssueTreeViewInternal 是一个继承自 ListView 的类。

【问题讨论】:

  • 最好也发布您用于项目/树视图的样式以及如何在 xaml 视图中使用树视图
  • 感谢您的评论。很抱歉一开始没有完成。

标签: c# wpf windows-10 windows-8.1 windows-7-x64


【解决方案1】:

我遇到了完全相同的问题。在 Windows 10 中添加了一些间距

这个 SO 答案修复了它: https://stackoverflow.com/a/15618991/4117068

这就是我所做的

<ListView ...>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="Margin" Value="0"/>
            <Setter Property="Padding" Value="0"/>
            <Setter Property="BorderThickness" Value="0"/>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    相关资源
    最近更新 更多