1

我正在做一个本地项目,但我遇到了一些问题。

我想为一些具有 3 个字符串(其中 1 是超链接)和一张图片的结果创建一个模板,它们作为绑定到 ItemSource 的结果类型的 ObservableCollection 出现。

public TestClass {
  public string Title { get; set; }
  public string Description { get; set; }
  public string Link { get; set; }
  public BitmapImage Thumbnail { get; set; }
}

因此,我想在 WPF 中显示这些结果,并且我想为每个项目使用一个模板并将它们显示在 StackPanel(或 ListView)中。

我尝试使用 ListView 但你唯一能做的就是选择整个项目,但我也希望链接是可点击的。

我的问题是:如何创建一个用于每个项目的模板,然后将它们添加到一个列表中,其中 1 个字符串是可点击的?

4

2 回答 2

0

正如 Unflux 提到的,这是一个很好的方法。至于可点击的链接,请Hyperlink像下面那样使用控件。

<ItemsControl ItemsSource="{Binding Persons}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding FirstName}" Grid.Row="0" Grid.Column="0" />
                <TextBlock Text="{Binding LastName}" Grid.Row="0" Grid.Column="1" />
                <TextBlock Text="{Binding Age}" Grid.Row="0" Grid.Column="2" />
                <TextBlock Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3">
                    <Hyperlink NavigateUri="{Binding BlogAddress}" Click="Hyperlink_OnClick">
                        <TextBlock Text="{Binding BlogAddress}" />
                    </Hyperlink>
                </TextBlock>                        
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

和代码隐藏

private void Hyperlink_OnClick(object sender, RoutedEventArgs e)
{
    var link = sender as Hyperlink;
    Process.Start(link.NavigateUri.ToString());
}

结果是

演示截图

您可能想要对其进行一些样式设置,并可能应用不同的样式ItemsPanel来真正自定义您的收藏的外观。你也可以ItemsControl用滚动来装饰。

于 2014-11-22T08:57:02.183 回答
0

感谢使用 ItemsControl 及其模板的想法。但是我使它与 Click 属性一起使用的超链接并给它一个:

 public ICommand RunHyperlink {
     get {
         return new ActionCommand(this.ButtonClick);
     }
 }

 private void ButtonClick() {
        Process.Start(new ProcessStartInfo(this.Link));
 }
于 2014-11-22T09:52:56.470 回答