代码之家  ›  专栏  ›  技术社区  ›  Artur Carvalho

WPF ListBoxItem未填充

  •  1
  • Artur Carvalho  · 技术社区  · 17 年前

    在listbox中,当我选择一个项目时,我仍然会在listboxitem周围获得某种边框或空格,从而创建您在图像中看到的线条。我想去掉那条线,我在它周围画了一个圈。

    已经有了 HorizontalContentAlignment = "Stretch" 顺便说一句

    我做错了什么?

    alt text

    5 回复  |  直到 6 年前
        1
  •  2
  •   Cameron MacFarland    17 年前

    马特是对的,这是一种错误。填充在ListBox模板中硬编码,而不是绑定到可以更改的属性。

    解决此问题的最佳方法是重新定义模板,如下所示:

    <ListBox>
        <ListBox.Template>
            <ControlTemplate TargetType="{x:Type ListBox}">
                <Border 
                    SnapsToDevicePixels="true" 
                    x:Name="Bd" 
                    Background="{TemplateBinding Background}" 
                    BorderBrush="{TemplateBinding BorderBrush}" 
                    BorderThickness="{TemplateBinding BorderThickness}" 
                    Padding="0"> <!-- This was originally 1 -->
                    <ScrollViewer 
                        Focusable="false" 
                        Padding="{TemplateBinding Padding}">
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </ScrollViewer>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter 
                            Property="Background" 
                            TargetName="Bd" 
                            Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                    </Trigger>
                    <Trigger Property="IsGrouping" Value="true">
                        <Setter 
                            Property="ScrollViewer.CanContentScroll" 
                            Value="false"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </ListBox.Template>
    
        <ListBoxItem>Item1</ListBoxItem>
        <ListBoxItem>Item2</ListBoxItem>
        <ListBoxItem>Item3</ListBoxItem>
    </ListBox>
    
        2
  •  2
  •   MattSlay    17 年前

    我认为这是列表框中的一个错误。下面是我如何使我的项目模板伸展以填充列表框的宽度。使每个列表项的容器成为一个单单元格网格,并使用grid loaded事件调用一个方法,该方法将网格延伸到ListBox的宽度。

    <ListBox x:Name="lvHolePatterns"  ItemsSource="{Binding HolePatterns}"
                                  SelectedItem="{Binding ActivePattern, Mode=TwoWay}"
                                  HorizontalContentAlignment="Stretch"
                                  ScrollViewer.VerticalScrollBarVisibility="Visible"
                                  Background="Gray">
    
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Loaded="StretchFrameworkElement">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Border Margin="0,3,5,3" BorderThickness="1" BorderBrush="SlateGray" CornerRadius="4"
                    RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Stretch" >
                    <Border.Background>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="#FF000000" Offset=" 1"/>
                            <GradientStop Color="#FF396DBE" Offset="0"/>
                        </LinearGradientBrush>
                    </Border.Background>
                    <StackPanel Orientation="Vertical" >
                        <TextBlock FontWeight="Bold" Text="{Binding Path=PatternName}" Foreground="WHITE" VerticalAlignment="Center"  Margin="5,5,0,5"/>
                        <StackPanel Orientation="Horizontal" Margin="5,0,0,5">
                            <TextBlock Text="{Binding Path=HoleCount}" Margin="10,0,0,0" Foreground="WHITE" VerticalAlignment="Center"/>
                            <TextBlock Text=" Holes" Margin="3,0,0,0" Foreground="WHITE" VerticalAlignment="Center"/>
                            <CheckBox Content="Visible" IsChecked="{Binding Visible, Mode=TwoWay}" Foreground="WHITE" Margin="10,0,0,0" />
                        </StackPanel>
                    </StackPanel>
                </Border>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
    </ListBox>
    

    然后,添加此方法以处理网格加载事件:

    private void StretchFrameworkElement(object sender, RoutedEventArgs e)
    {
        // found this method at: http://silverlight.net/forums/p/18918/70469.aspx#70469
        FrameworkElement t = sender as FrameworkElement;
        ContentPresenter p = VisualTreeHelper.GetParent(t) as ContentPresenter;
        p.HorizontalAlignment = HorizontalAlignment.Stretch;       
    }
    
        3
  •  1
  •   MattSlay    17 年前

    <ListView x:Name="lvHolePatterns" ItemsSource="{Binding Path=HolePatterns}"
                                  SelectedItem="{Binding Path=ActivePattern}"
                                  IsSynchronizedWithCurrentItem="True"
                                  HorizontalContentAlignment="Stretch"
                                  ScrollViewer.VerticalScrollBarVisibility="Visible"
                                  Background="Gray">
        <ListView.ItemContainerStyle>
            <Style BasedOn="{StaticResource lvRowHighlighter}" TargetType="{x:Type ListViewItem}">
                <!--<Setter Property="Height" Value="50" />-->
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Border Margin="0,3,5,3" BorderThickness="1" BorderBrush="SlateGray" CornerRadius="4" RenderTransformOrigin="0.5,0.5">
                    <Border.Background>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="#FF000000" Offset=" 1"/>
                            <GradientStop Color="#FF396DBE" Offset="0"/>
                        </LinearGradientBrush>
                    </Border.Background>
                    <StackPanel Orientation="Vertical">
                        <TextBlock FontWeight="Bold" Text="{Binding Path=PatternName}" Foreground="WHITE" VerticalAlignment="Center"  Margin="5,5,0,5"/>
                        <StackPanel Orientation="Horizontal" Margin="5,0,0,5">
                            <TextBlock Text="{Binding Path=HoleCount}" Margin="15,0,0,0" Foreground="WHITE" VerticalAlignment="Center"/>
                            <TextBlock Text=" Holes" Margin="3,0,0,0" Foreground="WHITE" VerticalAlignment="Center"/>
                            <CheckBox Content="Visible" IsChecked="{Binding Path=Visible}" Foreground="WHITE" Margin="10,0,0,0" />
                    </StackPanel>
                    </StackPanel>
                </Border>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    
        4
  •  0
  •   henon    16 年前

    我发现了一个非常简单的解决listbox项中硬编码填充问题的方法:将datatemplate中最外层元素的边距设置为-1

        5
  •  0
  •   musefan    14 年前

    只需将其添加到文本框实例属性:

    HorizontalContentAlignment="Stretch"
    

    Is将在没有任何代码的情况下完成这项工作。