Я осуществление контроля 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 всегда равно нулю, и, следовательно, стиль не применяется.
Что мне здесь не хватает?
Спасибо Raul, что работало - но почему я должен ссылаться на Generic.xaml в моем приложении ресурсах? Я сделал другие пользовательские элементы управления и никогда не добавлял их в ресурсы. Это потому, что его образец данных? – fergs
Ресурсы App.xaml являются глобальными приложениями. Это означает, что все компоненты могут получить к ним доступ (если не перезаписать). Если вы создаете экземпляры пользовательского элемента управления, вы можете сделать это в любом месте своего приложения, но если вам нужны кисти доступа, шаблоны данных, стили, ... вы должны определить их в ресурсных словарях, а один из них App.xaml - это app gobal one. –