Контекст: я пишу клиент UWP для Twitter.
Одним из полезных фрагментов данных, которые Twitter возвращает через свой API, являются объекты для контента, которые могут быть связаны непосредственно в твите — #hashtags, @usernames, $symbols и URL-адреса. Это позволяет легко извлекать эти объекты из строки, содержащей полный текст твита, чтобы превратить их в ссылки.
Я понимаю, как XAML должен искать это с помощью тегов <run>
и <hyperlink>
, и я понял, как динамически создавать этот XAML для каждого объекта твита.
Чего я не могу понять, так это того, как внедрить сгенерированный XAML в файл DataTemplate
моего приложения. Поскольку содержимое твита должно отображаться на нескольких страницах в приложении, я использую ResourceDictionary
для хранения всех стилей XAML, включая DataTemplate
. Итак, я совершенно не уверен, как подключить сгенерированный XAML к пользовательскому интерфейсу моего приложения.
Например, если твит выглядит так:
«Эй, @twitter, ты попусту тратишь время! #FridayFeeling»
Мои сгенерированные объекты XAML выглядят так:
<Run>Hey </Run>
<Hyperlink link="http://twitter.com/twitter/">@twitter</Hyperlink>
<Run>, you're a time waster! </Run>
<Hyperlink link="http://twitter.com/search?hashtag=FridayFeeling">#FridayFeeling</Hyperlink>
Если в тексте твита не на что ссылаться, я могу просто использовать Tweet.Text
как есть, поэтому я пытаюсь связать это с TextBox
. Как я могу динамически вставить этот XAML?
Я застрял, полностью отказавшись от привязки данных и перебирая свою коллекцию, чтобы программно добавить все мои XAML?
Вот мой шаблон данных:
<DataTemplate x:Key="TweetTemplate" x:DataType="tweeter:Tweet2">
<Grid Style="{StaticResource ListItemStyle}">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" x:Name="RetweetedBy" x:Load="{x:Bind IsRetweet}" Height="28">
<StackPanel Orientation="Horizontal" Padding="4 8 4 0">
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="12"/>
<Setter Property="Foreground" Value="{ThemeResource SystemControlPageTextBaseMediumBrush}" />
</Style>
</StackPanel.Resources>
<Border Height="28">
<TextBlock Height="24" FontFamily="{StaticResource FontAwesome}" xml:space="preserve"><Run Text=" "/></TextBlock>
</Border>
<TextBlock Text="{x:Bind Path=User.Name}" />
<TextBlock Text=" retweeted"/>
</StackPanel>
</Grid>
<Grid Grid.Row="1">
<StackPanel Orientation="Horizontal" Padding="5">
<TextBlock Text="{x:Bind Path=Tweet.User.Name}" Margin="0 0 8 0" FontWeight="Bold" />
<TextBlock Text="{x:Bind Path=Tweet.User.ScreenName, Converter={StaticResource GetHandle}}" Foreground="{ThemeResource SystemControlPageTextBaseMediumBrush}" />
<TextBlock Text="⦁" Margin="8 0" />
<TextBlock Text="{x:Bind Path=Tweet.CreationDate, Converter={StaticResource FormatDate}}" />
</StackPanel>
</Grid>
<Grid Grid.Row="2">
<TextBlock Text="***this is where I'm having problems***" Padding="5" TextWrapping="WrapWholeWords"/>
</Grid>
<Grid Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2.5*" MaxWidth="100"/>
<ColumnDefinition Width="2.5*"/>
<ColumnDefinition Width="2.5*"/>
<ColumnDefinition Width="2.5*"/>
</Grid.ColumnDefinitions>
<Grid Grid.Column="0">
<Button x:Name="cmdComment" Content="" Style="{StaticResource MetaButtons}" />
</Grid>
<Grid Grid.Column="1">
<Button x:Name="cmdRetweet" Content="" Style="{StaticResource MetaButtons}" />
</Grid>
<Grid Grid.Column="2">
<Button x:Name="cmdLike" Content="" Style="{StaticResource MetaButtons}" />
</Grid>
<Grid Grid.Column="3">
<Button x:Name="cmdMessage" Content="" Style="{StaticResource MetaButtons}" />
</Grid>
</Grid>
</Grid>
</DataTemplate>