2009-06-18 12 views
4

Ich habe an einem SplitButton-Steuerelement für WPF gearbeitet und es ist im Grunde genommen fertig, aber ich versuche, alle möglichen Eigenschaften durchzugehen, die darauf gesetzt werden können, und stelle sicher, dass sie tatsächlich implementiert sind. Ich habe meistens nur noch zwei Eigenschaften zu implementieren, die die ItemTemplate und ItemTemplateSelector (und AlternationCount, okay so 3 Eigenschaften) sind.WPF - ItemTemplate für einen ItemsPresenter implementieren?

konnte ich die HeaderTemplate und HeaderTemplateSelector Funktion erhalten, indem Sie auf einem ContentPresenter die ContentTemplate und ContentTemplateSelector ihnen binden. Dies gilt jedoch für den Button-Teil des Controls. Für den Drop-Drop-Teil des Steuerelements verwende ich ein Popup, Border und ItemsPresenter. Das Problem ist, dass ich nicht herausfinden kann, wie man die Eigenschaften ItemTemplate und ItemTemplateSelector für die ItemsPresenter setzt.

Irgendwelche Ideen?


aktualisieren: Der vollständige Quellcode für die Splitbutton ist jetzt verfügbar unter: http://anothersplitbutton.codeplex.com/

Hier ist die Luna.NormalColor.xaml Datei:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:WpfSplitButton="clr-namespace:WpfSplitButton" 
        xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <!-- SplitButtonHeader Style --> 
    <Style x:Key="{x:Type WpfSplitButton:SplitButtonHeader}" 
      TargetType="{x:Type WpfSplitButton:SplitButtonHeader}"> 

     <Style.Resources> 
      <Style x:Key="ButtonFocusVisual"> 
       <Setter Property="Control.Template"> 
        <Setter.Value> 
         <ControlTemplate> 
          <Rectangle Margin="2" 
             StrokeThickness="1" 
             Stroke="Black" 
             StrokeDashArray="1 2" 
             SnapsToDevicePixels="True" /> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </Style.Resources> 

     <Style.Setters> 
      <Setter Property="FocusVisualStyle" 
        Value="{StaticResource ButtonFocusVisual}" /> 
      <Setter Property="HorizontalContentAlignment" 
        Value="Center" /> 
      <Setter Property="PastLeftDetection" 
        Value="True" /> 
      <Setter Property="VerticalContentAlignment" 
        Value="Center" /> 

      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <mwt:ButtonChrome x:Name="Chrome" 
              BorderBrush="{TemplateBinding Border.BorderBrush}" 
              RenderDefaulted="{TemplateBinding Button.IsDefaulted}" 
              RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}" 
              RenderPressed="{TemplateBinding ButtonBase.IsPressed}" 
              SnapsToDevicePixels="True"> 

          <Grid Background="{TemplateBinding ButtonBase.Background}"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="*" /> 
            <ColumnDefinition Width="Auto" /> 
           </Grid.ColumnDefinitions> 

           <ContentPresenter Content="{TemplateBinding ContentControl.Content}" 
                ContentTemplate="{TemplateBinding ButtonBase.ContentTemplate}" 
                ContentTemplateSelector="{TemplateBinding ButtonBase.ContentTemplateSelector}" 
                HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" 
                Margin="{TemplateBinding Control.Padding}" 
                RecognizesAccessKey="True" 
                SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" 
                VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" /> 

           <Border x:Name="PART_DropDownInitiator" 
             Background="Transparent" 
             BorderBrush="{Binding Path=BorderBrush, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type WpfSplitButton:SplitButtonHeader}}}" 
             BorderThickness="1,0,0,0" 
             Grid.Column="1" 
             HorizontalAlignment="Stretch" 
             Margin="0,0,0,0" 
             Padding="4,0,4,0" 
             VerticalAlignment="Stretch"> 

            <Path Fill="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type WpfSplitButton:SplitButtonHeader}}}" 
              VerticalAlignment="Center"> 

             <Path.Style> 
              <Style> 
               <Setter Property="Path.Fill" 
                 Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}" /> 

               <Style.Triggers> 
                <Trigger Property="WpfSplitButton:SplitButton.IsMouseOver" 
                  Value="True"> 
                 <Setter Property="Path.Fill" 
                   Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" /> 
                </Trigger> 
               </Style.Triggers> 
              </Style> 
             </Path.Style> 

             <Path.Data> 
              <PathGeometry> 
               <PathGeometry.Figures> 
                <PathFigureCollection> 
                 <PathFigure IsClosed="True" 
                    StartPoint="0,0"> 
                  <PathFigure.Segments> 
                   <PathSegmentCollection> 
                    <LineSegment Point="8,0" /> 
                    <LineSegment Point="4,5" /> 
                   </PathSegmentCollection> 
                  </PathFigure.Segments> 
                 </PathFigure> 
                </PathFigureCollection> 
               </PathGeometry.Figures> 
              </PathGeometry> 
             </Path.Data> 
            </Path> 
           </Border> 
          </Grid> 
         </mwt:ButtonChrome> 

         <ControlTemplate.Triggers> 
          <Trigger Property="UIElement.IsKeyboardFocused" 
            Value="True"> 
           <Setter TargetName="Chrome" 
             Property="mwt:ButtonChrome.RenderDefaulted" 
             Value="True" /> 
          </Trigger> 

          <Trigger Property="ToggleButton.IsChecked" 
            Value="True"> 
           <Setter TargetName="Chrome" 
             Property="mwt:ButtonChrome.RenderPressed" 
             Value="True" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style.Setters> 
    </Style> 

    <!-- SplitButton --> 
    <Style x:Key="{x:Type WpfSplitButton:SplitButton}" 
      TargetType="{x:Type WpfSplitButton:SplitButton}"> 

     <Style.Resources> 
      <LinearGradientBrush x:Key="ButtonNormalBackgroundFill" 
           EndPoint="0.5,1" 
           StartPoint="0.5,0"> 
       <LinearGradientBrush.GradientStops> 
        <GradientStop Color="#FFFFFFFF" 
            Offset="0" /> 
        <GradientStop Color="#FFF0F0EA" 
            Offset="0.9" /> 
       </LinearGradientBrush.GradientStops> 
      </LinearGradientBrush> 

      <SolidColorBrush x:Key="ButtonBorder" 
          Color="#FF003C74" /> 
     </Style.Resources> 

     <Setter Property="AutoUpdateHeader" 
       Value="True" /> 

     <Setter Property="Background" 
       Value="{StaticResource ButtonNormalBackgroundFill}" /> 

     <Setter Property="BorderBrush" 
       Value="{StaticResource ButtonBorder}" /> 

     <Setter Property="BorderThickness" 
       Value="1" /> 

     <Setter Property="Foreground" 
       Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" /> 

     <Setter Property="HorizontalContentAlignment" 
       Value="Center" /> 

     <Setter Property="Padding" 
       Value="4,4,4,4" /> 

     <Setter Property="VerticalContentAlignment" 
       Value="Center" /> 

     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type WpfSplitButton:SplitButton}"> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="*" /> 
          <RowDefinition Height="Auto" /> 
         </Grid.RowDefinitions> 

         <WpfSplitButton:SplitButtonHeader x:Name="PART_Header" 
                  Background="{TemplateBinding Background}" 
                  BorderBrush="{TemplateBinding BorderBrush}" 
                  BorderThickness="{TemplateBinding BorderThickness}" 
                  Content="{TemplateBinding Header}" 
                  ContentTemplate="{TemplateBinding HeaderTemplate}" 
                  ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}" 
                  Cursor="{TemplateBinding Cursor}" 
                  Foreground="{TemplateBinding Foreground}" 
                  Grid.Row="0" 
                  HorizontalAlignment="Stretch" 
                  HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" 
                  Padding="{TemplateBinding Padding}" 
                  VerticalAlignment="Stretch" 
                  VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" /> 

         <Popup x:Name="PART_Popup" 
           AllowsTransparency="True" 
           Grid.Row="1" 
           IsOpen="{Binding Path=IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" 
           MinWidth="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type WpfSplitButton:SplitButton}}}" 
           Placement="Bottom" 
           PlacementTarget="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type WpfSplitButton:SplitButton}}}" 
           PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" 
           StaysOpen="False"> 

          <mwt:SystemDropShadowChrome Color="Transparent"> 
           <Border x:Name="DropDownBorder" 
             Background="{TemplateBinding Background}" 
             BorderBrush="{TemplateBinding BorderBrush}" 
             BorderThickness="{TemplateBinding BorderThickness}"> 

            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
           </Border> 
          </mwt:SystemDropShadowChrome> 
         </Popup> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 

     <Style.Triggers> 
      <Trigger Property="IsEnabled" 
        Value="False"> 
       <Setter Property="Foreground" 
         Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ResourceDictionary> 

Update 2 Ich habe versucht, den ItemsPresenter mit einem ItemsControl auszuschalten, aber ich kann die ItemTemplate-Eigenschaft nicht dazu bringen, etwas zu tun. Hier ist der geänderte Code-Abschnitt:

<ItemsControl DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type WpfSplitButton:SplitButton}}}" 
       AlternationCount="{TemplateBinding AlternationCount}" 
       IsTabStop="{TemplateBinding IsTabStop}" 
       IsTextSearchEnabled="{TemplateBinding IsTextSearchEnabled}" 
       ItemContainerStyle="{TemplateBinding ItemContainerStyle}" 
       ItemContainerStyleSelector="{TemplateBinding ItemContainerStyleSelector}" 
       ItemBindingGroup="{TemplateBinding ItemBindingGroup}" 
       ItemsPanel="{TemplateBinding ItemsPanel}" 
       ItemsSource="{Binding Path=Items}" 
       ItemStringFormat="{TemplateBinding ItemStringFormat}" 
       ItemTemplateSelector="{TemplateBinding ItemTemplateSelector}" 
       SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="HELLO" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
+0

Können Sie weitere Informationen posten? Vielleicht kommt Probe Xaml? – rudigrobler

+0

Ich habe einen Teil des Quellcodes und einen Link zum vollständigen Quellcode hinzugefügt. – Thrash505

Antwort

1

Haben Sie darüber nachgedacht eine ItemsControl anstelle des ItemsPresenter verwenden? Dies würde Ihnen die ItemTemplate und ItemTemplateSelector Eigenschaft sowie die AlternationCount Eigenschaft geben.

Update: Ich habe es einfach gut zu arbeiten, um die Itemscontrol mit, wie Sie oben mit der folgenden Zeile geschrieben in Ihrer Classic.xaml Datei an das ItemsTemplate Eigentum zu binden:

ItemTemplate="{TemplateBinding ItemsTemplate, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type WpfSplitButton:SplitButton}}}" 

Dann in Ihrem Mainwindow die Ressourcen habe ich nur noch die folgende Vorlage:

<DataTemplate x:Key="Test"> 
    <MenuItem Header="{Binding}" /> 
</DataTemplate> 

Dann ich die ItemTemplate-Eigenschaft auf dem Splitbutton set:

So einfach Ihre ItemSource anschließen und Sie sind gut zu gehen ... Ich habe nur eine einfache Zeichenfolge [] im Code hinter ... Hope this hilft!

+0

Ich habe es gerade mit einem ItemsControl ausgeschaltet, wie Sie es vorgeschlagen haben, aber wenn ich die ItemTemplate-Eigenschaft festlege, passiert nichts. Ich kann immer noch die ItemsSource-Funktion binden, aber nicht viel anderes ... Ich habe sogar versucht, ItemTemplate direkt in der Theme-Datei zu setzen, aber es hat immer noch keinen Effekt. – Thrash505

+0

Ich habe meinen Beitrag mit dem Code aktualisiert. – Thrash505

+0

Ich habe Ihren Code heruntergeladen und es funktioniert gut mit dem Code in meinem Update. –