2009-06-18 2 views
4

私はWPF用のSplitButtonコントロールで作業していましたが、基本的には完了しましたが、設定可能なすべてのプロパティを調べて、実際に実装されていることを確認しようとしています。私はたいてい実装するために残されたプロパティは2つしかありません。これはItemTemplateItemTemplateSelector(そしてAlternationCount、大丈夫な3つのプロパティ)です。WPF - ItemsPresenterのItemTemplateを実装していますか?

私はContentPresenterにそれらにContentTemplateContentTemplateSelectorを結合することによってHeaderTemplateHeaderTemplateSelector作業を取得することができました。これは、しかし、コントロールのボタンの部分です。私はポップアップ、ボーダー、およびItemsPresenterを使用しているコントロールのドロップドロップ部分については。問題は、ItemsPresenterのプロパティーをItemTemplateItemTemplateSelectorに設定する方法がわかりません。

アイデア?


更新: SplitButtonのための完全なソースコードはで利用可能になりました:

<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> 

http://anothersplitbutton.codeplex.com/

ここLuna.NormalColor.xamlファイルです更新2 ItemsControlでItemsPresenterを切り替えることを試みましたが、何もするItemTemplateプロパティを取得できないようです。ここでは、コードの変更部分があります:

<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

詳細情報を投稿できますか?たぶんサンプルxamlが来る? – rudigrobler

+0

私はいくつかのソースコードと完全なソースコードへのリンクを追加しました。 – Thrash505

答えて

1

あなたはItemsControl代わりのItemsPresenterを使用して考えがありますか?これにより、ItemTemplateItemTemplateSelectorプロパティとAlternationCountプロパティが得られます。

アップデート:私はあなたがあなたのClassic.xamlファイルにItemsTemplateプロパティにバインドするために次の行を使用して、上記の投稿のように、それはItemsControlにを使用してうまく動作するようになった :に続いて

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

あなた私は、次のテンプレートを追加メインウィンドウのリソース:

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

は、私はSplitButtonにItemTemplateにプロパティを設定します。

ItemTemplate="{StaticResource Test}" 

だからあなたのItemSourceをフックアップし、あなたが行ってもいいです...私は[]の背後にあるコードでは、単純な文字列を使用し... 希望このことができます!

+0

あなたが提案したようなItemsControlでそれを切り替えただけですが、ItemTemplateプロパティを設定すると何も起こりません。私はまだItemsSourceのproeprtyをバインドすることができますが、あまり多くはありません。 テーマファイルに直接ItemTemplateを設定しようとしましたが、それでも効果はありません。 – Thrash505

+0

私は自分のポストをコードで更新しました。 – Thrash505

+0

私はあなたのコードをダウンロードし、私のアップデートのコードでうまく動作するようにしました。 –

関連する問題