2014-01-10 3 views
1

Я осуществление контроля Tokenizing в соответствии с этим сайтом: http://blog.pixelingene.com/2010/10/tokenizing-control-convert-text-to-tokens/Использования DataTemplate в Generic.xaml для WPF пользовательского элемента управления

И я сейчас пытаюсь аккуратными вещи и сделать его более MVVM дружелюбным. Так я переехал DataTemplate из ресурсов Windows в Themes/файл Generic.xaml:

<Style TargetType="{x:Type local:TokenizingControl}"> 
    <Style.Resources> 
     <DataTemplate x:Key="NameTokenTemplate"> 
      <DataTemplate.Resources> 
       <Storyboard x:Key="OnLoaded1"> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="border"> 
         <SplineDoubleKeyFrame KeyTime="0" Value="0"/> 
         <SplineDoubleKeyFrame KeyTime="0:0:0.5" Value="1"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </DataTemplate.Resources> 
      <Border x:Name="border" BorderBrush="#FF7E7E7E" BorderThickness="2" CornerRadius="5" Height="Auto" Padding="5,3" Margin="3,0,3,3"> 
       <Border.Background> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="#FFFFD0A0" Offset="0"/> 
         <GradientStop Color="#FFAB5600" Offset="1"/> 
        </LinearGradientBrush> 
       </Border.Background> 
       <Grid HorizontalAlignment="Left" Width="Auto"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="0.21*"/> 
         <ColumnDefinition Width="0.79*"/> 
        </Grid.ColumnDefinitions> 
        <!--<Image HorizontalAlignment="Right" Source="\Images\14-tag.png" Stretch="None" Width="Auto" Grid.Column="0" VerticalAlignment="Center"/>--> 
        <TextBlock TextWrapping="NoWrap" Text="{Binding}" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="1" Margin="10,0,0,0" FontWeight="Bold"/> 
       </Grid> 
      </Border> 
      <DataTemplate.Triggers> 
       <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
        <BeginStoryboard Storyboard="{StaticResource OnLoaded1}"/> 
       </EventTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </Style.Resources> 
    <Setter Property="TokenTemplate" Value="{StaticResource NameTokenTemplate}"></Setter> 
</Style> 

Я обновить контроль, чтобы загрузить общий стиль в конструкторе:

public TokenizingControl() 
    { 
     // lookless control, get default style from generic.xaml 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(TokenizingControl), new FrameworkPropertyMetadata(typeof(TokenizingControl))); 

     TextChanged += OnTokenTextChanged; 
    } 

Однако свойство TokenTemplate всегда равно нулю, и, следовательно, стиль не применяется.

Что мне здесь не хватает?

ответ

1

Попробуйте поместить шаблон данных NameTokenTemplate в словарь ресурсов generic.xaml, непосредственно перед линией <Style TargetType="{x:Type local:TokenizingControl}">.

Убедитесь, что вы делаете ссылку на generic.xaml в App.xaml:

<Application.Resources> 
     <ResourceDictionary> 
      <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Views/generic.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
+0

Спасибо Raul, что работало - но почему я должен ссылаться на Generic.xaml в моем приложении ресурсах? Я сделал другие пользовательские элементы управления и никогда не добавлял их в ресурсы. Это потому, что его образец данных? – fergs

+0

Ресурсы App.xaml являются глобальными приложениями. Это означает, что все компоненты могут получить к ним доступ (если не перезаписать). Если вы создаете экземпляры пользовательского элемента управления, вы можете сделать это в любом месте своего приложения, но если вам нужны кисти доступа, шаблоны данных, стили, ... вы должны определить их в ресурсных словарях, а один из них App.xaml - это app gobal one. –

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