代码之家  ›  专栏  ›  技术社区  ›  Elisabeth

在WPF组合框控件模板的ScrollViewer上放置“列标题”

  •  0
  • Elisabeth  · 技术社区  · 15 年前

    WPF: Refine the look of a grouped ComboBox vs. a grouped DataGrid -sample attached -

    http://www.sendspace.com/file/ru8hju (VS2010.Net 4.0项目)

    我的问题是,当我有一个自定义的COBOBOX项目条目时,如何在StReVIEW中添加一个“Stand Posits”的“列标题”,将2个文本块添加到我现有的组合框控件模板中,并且在默认的组合框控件模板中有iTimePosiver。

    这是我现有的分组不可编辑的组合框。在scrollviewer上(12月上方…),我想要两个文本块。

    如何使用我的XAML代码做到这一点,请参见底部:

    alt text

    <Window  x:Class="TestComboGrouped.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"       
            Title="MainWindow" Height="600" Width="200">
        <Window.Resources>
            <SolidColorBrush x:Key="SelectedBackgroundBrush" Color="Orange" />
            <SolidColorBrush x:Key="DisabledForegroundBrush" Color="#888" />
    
            <Style x:Key="ComboBoxItemStyle" TargetType="ComboBoxItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ComboBoxItem">
                            <Grid HorizontalAlignment="Stretch"
                          Margin="-5,0,0,0"
                          Background="{TemplateBinding Background}">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="45"/>
                                </Grid.ColumnDefinitions>
                                <Border Name="border1"
                                BorderThickness="0,0,1,1"
                                BorderBrush="#FFCEDFF6"
                                Grid.Column="0">
                                    <TextBlock Foreground="Purple"
                                       HorizontalAlignment="Right"
                                       Margin="0,0,5,0"
                                       Text="{Binding WeeklyLessonDate, StringFormat='yyyy-MM-dd'}"/>
                                </Border>
                                <Border Name="border2"
                                BorderThickness="0,0,1,1"
                                BorderBrush="#FFCEDFF6"
                                Grid.Column="1">
                                    <TextBlock HorizontalAlignment="Center"
                                       Text="{Binding WeekNumber}"/>
                                </Border>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsHighlighted" Value="true">
                                    <Setter TargetName="border1" Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/>
                                    <Setter TargetName="border2" Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/>
                                </Trigger>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="Foreground" Value="Red"/>
                <Style.Triggers>
                    <Trigger Property="ComboBox.AlternationIndex" Value="0">
                        <Setter Property="Background" Value="White"></Setter>
                    </Trigger>
                    <Trigger Property="ComboBox.AlternationIndex" Value="1">
                        <Setter Property="Background" >
                            <Setter.Value>
                                <LinearGradientBrush RenderOptions.EdgeMode="Aliased" StartPoint="0.5,0.0" EndPoint="0.5,1.0">
                                    <GradientStop Color="#FFFEFEFF" Offset="0"/>
                                    <GradientStop Color="#FFE4F0FC" Offset="1"/>
                                </LinearGradientBrush>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </Style.Triggers>
            </Style>
    
            <!-- Grouped CollectionView -->
            <CollectionViewSource Source="{Binding WeeklyDateList,IsAsync=False}" x:Key="WeeklyView">
                <CollectionViewSource.GroupDescriptions>
                    <PropertyGroupDescription PropertyName="MonthName"/>
                </CollectionViewSource.GroupDescriptions>
            </CollectionViewSource>
    
        </Window.Resources>
        <StackPanel>
            <ComboBox 
                ItemsSource="{Binding Source={StaticResource ResourceKey=WeeklyView}}"      
                ScrollViewer.HorizontalScrollBarVisibility="Auto" 
                ItemContainerStyle="{StaticResource ComboBoxItemStyle}"          
                AlternationCount="2" 
                MaxDropDownHeight="300" 
                Width="Auto" 
                x:Name="comboBox"
                >
                <ComboBox.GroupStyle>
                    <GroupStyle>
                        <GroupStyle.HeaderTemplate>
                            <DataTemplate>
                                <TextBlock 
                                   Padding="5,0,0,0"
                                    Background="White" 
                                    Foreground="DarkBlue" 
                                    FontSize="14" 
                                    FontWeight="DemiBold" 
                                    Text="{Binding Name}"/>
                            </DataTemplate>
                        </GroupStyle.HeaderTemplate>
                    </GroupStyle>
                </ComboBox.GroupStyle>
                <!--<ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Border Style="{StaticResource ComboBoxBorderStyle}">
                                <TextBlock Width="100" Foreground="Purple"  Text="{Binding WeeklyLessonDate, StringFormat='yyyy-MM-dd'}"/>
                            </Border>
                            <Border Style="{StaticResource ComboBoxBorderStyle}">
                                <TextBlock Padding="5,0,5,0"  Width="40"   Text="{Binding WeekNumber}"/>
                            </Border>                    
                        </StackPanel>                   
                    </DataTemplate>
                </ComboBox.ItemTemplate>-->   
            </ComboBox>
        </StackPanel>
    </Window>
    

    :

    好的,很好的消息,我又找到了我的旧代码,我以为我不知怎么弄丢了:)

    下面是组合框的样式。我在那里贴了一些自己的xaml,看我的评论 在下面的控制模板中。前一个组合框的列标题。

    风格。

                                <Border x:Name="DropDownBorder" BorderBrush="DarkBlue" BorderThickness="2" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
    
                              // ColumnHeader START
    
                                <StackPanel >
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock HorizontalAlignment="Stretch" Text="lesson day" />
                                        <TextBlock HorizontalAlignment="Stretch" Text="week" />
                                    </StackPanel>
    
                              // ColumnHeader END
    
                                    <ScrollViewer x:Name="DropDownScrollViewer" Background="Green">
                                    <Grid RenderOptions.ClearTypeHint="Enabled">
                                        <Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
                                            <Rectangle x:Name="OpaqueRect" Fill="{Binding Background, ElementName=DropDownBorder}" Height="{Binding ActualHeight, ElementName=DropDownBorder}" Width="{Binding ActualWidth, ElementName=DropDownBorder}"/>
                                        </Canvas>
                                        <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                    </Grid>
                                </ScrollViewer>
                                </StackPanel>
                            </Border>
    
                        </Popup>
                        <ToggleButton BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" Grid.ColumnSpan="2" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ComboBoxReadonlyToggleButton}"/>
                        <ContentPresenter  ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" Content="{TemplateBinding SelectionBoxItem}" ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsHitTestVisible="false" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Grid>
                    <ControlTemplate.Triggers>                           
    
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                            <Setter Property="Background" Value="#FFF4F4F4"/>
                        </Trigger>
                        <Trigger Property="IsGrouping" Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                        </Trigger>                     
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsEditable" Value="true">
                <Setter Property="BorderBrush" Value="{StaticResource TextBoxBorder}"/>
                <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
                <Setter Property="IsTabStop" Value="false"/>
                <Setter Property="Padding" Value="3"/>
                <Setter Property="Template" Value="{StaticResource ComboBoxEditableTemplate}"/>
            </Trigger>
        </Style.Triggers>
    </Style> 
    

    带列标题的组合框=>

    http://img573.imageshack.us/img573/4202/columnheader.png

    alt text 更新2:

    这是带有列标题的代码,但是混乱的弹出窗口+滚动条不能正常工作。。。由于30000个字符的限制,我无法发布代码,请在这里获取它:

    http://www.sendspace.com/file/8puii8

    1 回复  |  直到 9 年前
        1
  •  0
  •   Fredrik Hedblad    15 年前

    再次更新
    在你的例子中也修复了它,只是改变了我下面的弹出窗口。如果从下载 here
    这个截图来自这个链接

    alt text

    推荐文章