• WPF ListBox研究笔记


      学习了下ListBox的Style,开始的时候比较混乱,但理顺了再写个Demo后就能一目了然的看出中间的差别了。下面来一个一个的理解下:

      1.Template:这个指的是ListBox这个控件的整体外观,这个类名为ControlTemplate,可以定义一些控件的自身外观,如圆角、颜色等。其中可以用<ItemsPresenter/>来替代容器中的子元素,然后在后面的Template中继续设置,或者也直接可以把模板写在中间,但需要加上IsItemsHost="True"在容器中显示这个子元素。我还是把他分开来写,这样能够清楚的分出每一个Template。下面是一个简单的整体设置:

    View Code
                <!--<ControlTemplate>-->
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBox">
                            <Border CornerRadius="5" BorderThickness="1" Background="LightBlue">
                                <ScrollViewer>
                                    <ItemsPresenter/>
                                </ScrollViewer>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>

      2.ItemsPanel:这个是指在ListBox控件里面的子元素的布局容器。这个的类名为ItemsPanelTemplate。其中间可以放入Grid、StackPanel、WrapPanel, DockPanel等布局模板。然后设置布局摆放的样式。如可以设置HorizontalAlignment、Orientation等属性。同样写一个简单的设置如下:

    View Code
    <!--<ItemsPanelTemplate>-->
                <Setter Property="ItemsPanel">
                    <Setter.Value>
                        <ItemsPanelTemplate>
                            <StackPanel HorizontalAlignment="Stretch"/>
                        </ItemsPanelTemplate>
                    </Setter.Value>
                </Setter>

      这前面的2个Template是针对整体的ListBox的设计<Style TargetType="ListBox"></Style>。而后面的2个Template则是针对<Style TargetType="ListBoxItem"></Style>。

      3.ItemContainerStyle:这个和第一个差不多都是设置整个样式,但是这个是针对的ListBoxItem。同样可以定义一些自身的外观。这里也就不重复了,但在这个可以直接在中间设置Item-Template的DataTemplate。也可以把这个东西给拖出来单独弄成一个DataTemplate。这样的话就要用 <ContentPresenter />来替代。继续简单设置:

    View Code
                <!--<ItemContainerStyle>-->
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <Border>
                                <ContentPresenter />
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>

      4.ItemTemplate:这个设置的是每一个ListBoxItem的单独的样式。这个的类名为DataTemplate。其中不仅可以设置普通的样式,同时还可以设置触发器来弄出你想要的样式。

    View Code
            <DataTemplate x:Key="datatemplate">
                <!--<ItemTemplate>-->
                <Border BorderBrush="Gray" BorderThickness="1" Margin="1">
                    <DockPanel>
                        <Ellipse Width="10" Height="10" DockPanel.Dock="Left" Visibility="Collapsed"
                                 Fill="Black" Margin="5" Name="ellipse"/>
                        <Grid>
                            <Border CornerRadius="5" Background="Green" Margin="2" Padding="3">
                                <TextBlock Text="{Binding Message}" TextTrimming="CharacterEllipsis"/>
                            </Border>
                            <Rectangle Name="rect"/>
                        </Grid>
                    </DockPanel>
                </Border>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ListBoxItem},Path=IsSelected}" Value="True">
                        <Setter TargetName="ellipse" Property="Visibility" Value="Visible"/>
                        <Setter TargetName="rect" Property="Fill">
                            <Setter.Value>
                                <LinearGradientBrush StartPoint="0,1" EndPoint="0,0">
                                    <GradientStop Offset="0" Color="#11ffffff"/>
                                    <GradientStop Offset="1" Color="#eeffffff"/>
                                </LinearGradientBrush>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </DataTemplate.Triggers>

      这样我们就完成了对ListBox的普通的解析。还有其他的更高级的东西的话。。。容我再研究研究=。=

      最后附一个Demo:https://files.cnblogs.com/socialdk/ListBox.zip

  • 相关阅读:
    codeforces 269B Greenhouse Effect
    codeforces 5C Longest Regular Bracket Sequence
    codeforces 225C Barcode
    codeforces 279C Ladder
    CodeForces 479E Riding in a Lift
    CodeForces 351A Jeff and Rounding
    POJ-1579-201308122106.txt
    表达式求值-201308081712.txt
    Encoding-201308072147.txt
    A + B Problem II201308072001.txt
  • 原文地址:https://www.cnblogs.com/socialdk/p/2639072.html
Copyright © 2020-2023  润新知