2010-04-22 3 views
1

Я довольно новичок в WPF, и у меня возникли проблемы с получением DataTemplateKey для поиска моего ListBox.WPF DataTemplateKey не может найти ключ ListBox

<Window.Resources> 

    <ControlTemplate x:Key="FocusTemplate" > 
     <Rectangle Fill="Azure" Width="290" Height="55" /> 
    </ControlTemplate> 
    <Style x:Key="FocusStyle" TargetType="{x:Type Control}"> 
     <Setter Property="Template" Value="{StaticResource FocusTemplate}"/> 
    </Style> 

    <Style TargetType="ListBoxItem"> 
     <EventSetter Event="GotFocus" Handler="ListItem_GotFocus"></EventSetter> 
    </Style> 

    <DataTemplate DataType="{x:Type TextBlock}"> 
    </DataTemplate> 

    <DataTemplate x:Key="CustomListData" DataType="{x:Type ListBox}"> 
     <Border BorderBrush="Black" BorderThickness="1" Margin="-2,0,0,-1"> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="55*" /> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 
       <Grid.RenderTransform> 
        <TransformGroup> 
         <ScaleTransform ScaleX="1" ScaleY="1"/> 
         <SkewTransform AngleX="0" AngleY="0"/> 
         <RotateTransform Angle="0"/> 
         <TranslateTransform X="0" Y="0"/> 
        </TransformGroup> 
       </Grid.RenderTransform> 
       <!--<ScrollViewer x:Name="PART_ContentHost" />--> 
       <TextBox Width="290" TextAlignment="Left" VerticalContentAlignment="Center" BorderThickness="0" BorderBrush="Transparent" 
             Foreground="#FF6FB8FD" 
             FontSize="18" 
             FocusVisualStyle="{StaticResource FocusStyle}" 
             Name="editingBox" 
             TextWrapping="Wrap" 
             Text="{Binding .}" 
             Grid.Column="1" 
             Grid.Row="1" 
             MinHeight="55" 
             Cursor="Hand" 
             IsReadOnly="True" 
             > 
        <TextBox.Background> 
         <LinearGradientBrush EndPoint="0,1" StartPoint="0,0"> 
          <LinearGradientBrush.RelativeTransform> 
           <TransformGroup> 
            <ScaleTransform CenterX="0.5" CenterY="0.5"/> 
            <SkewTransform CenterX="0.5" CenterY="0.5"/> 
            <RotateTransform Angle="0" CenterX="0.5" CenterY="0.5"/> 
            <TranslateTransform/> 
           </TransformGroup> 
          </LinearGradientBrush.RelativeTransform> 
          <GradientStop Color="#FF2D4984"/> 
          <GradientStop Color="#FF182D56" Offset="0.042"/> 
         </LinearGradientBrush> 
        </TextBox.Background> 

       </TextBox> 
      </Grid> 
     </Border> 
    </DataTemplate> 

    <Style TargetType="{x:Type ListBox}"> 
     <Setter Property="ItemTemplate" Value="{StaticResource CustomListData }" /> 
     <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" /> 
    </Style> 

    </Window.Resources> 

    <Window.DataContext> 
    <ObjectDataProvider 
    ObjectType="{x:Type local:ImageLoader}" 
    MethodName="LoadImages" 
    /> 
    </Window.DataContext> 

    <ListBox ItemsSource="{Binding}" Width="320" Background="#FF021422" BorderBrush="#FF1C4B79"> 

     <ListBox.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}">Transparent</SolidColorBrush> 
     </ListBox.Resources> 

    </ListBox> 

Следующий код будет найти TextBlock

var key = new System.Windows.DataTemplateKey(typeof(TextBlock)); 
var r = (DataTemplate)this.FindResource(key); 

Однако, когда я изменить тип к ListBox, ключ не может быть найден. Что я пропустил?

Благодаря Райан

+0

Вы можете принять ответы, если это помогло – Amsakanna

ответ

1

Вы дали свой ListBox DataTemplate другой ключ, в частности, x:Key="CustomListData". Атрибут x:Key будет иметь приоритет над автоматическим DataTemplateKey, который сгенерирован на основе DataType. Удалите этот ключ и автоматический DataTemplateKey.

+0

Charlie, That отлично работает. Но теперь, как бы я использовал этот список, используя свой собственный ItemTemplate. Мне пришлось прокомментировать сеттер, так как у меня больше нет ключа. – Ryan

+0

Без ключа DataTemplate будет автоматически применяться к любым элементам одного и того же типа данных. Мне интересно, почему ваш CustomListData имеет свой DataType, помеченный как «ListBox», хотя он применяется к ListBoxItems. Возможно, измените свой DataType на ListBoxItem? – Charlie

+0

Спасибо, что сделал трюк! – Ryan

Смежные вопросы