【问题标题】:How to add small header (textblock) near the top left corner of the Image?如何在图像的左上角附近添加小标题(文本块)?
【发布时间】:2019-08-30 08:33:40
【问题描述】:

我有一个应用程序,它使用缩略图显示文档预览。 我需要的是在图像的每个缩略图附近都有一个小标题(文本)。 标题应该在图像的左侧,在顶部,如何在图片上显示。我设法在图像上添加了带有页数的文本块。 请给你的建议。图片缩略图是在后面的代码中动态生成的。这是后面的部分代码。我设法实现了我的目的,但我想找到更优雅的解决方案。

RowDefinitionCollection rd = gridPreview.RowDefinitions;
ColumnDefinitionCollection cd =gridPreview.ColumnDefinitions;

int columnAmount = Convert.ToInt32(Math.Truncate(gridPreviewWidth / GetThumbnailSizes(tiffImageList).Item2));
gridPreviewHeight = ((tiffImageList.Count / columnAmount) + 1) * GetThumbnailSizes(tiffImageList).Item1 + 100;

for (int i = 0; i < (tiffImageList.Count / columnAmount) + 1; i++)
{
    rd.Add(new RowDefinition() { Height = GridLength.Auto });
    for (int j = 0; j < columnAmount; j++)
    {
        cd.Add(new ColumnDefinition() { Width = GridLength.Auto });
    }
}

foreach (var tiffImage in tiffImageList)
{
    if (columnIndex == columnAmount)
    {
        columnIndex = 0;
        rowIndex++;
    }


    Image imagePreviewItem = new Image();
    imagePreviewItem.Margin = new Thickness(20, 20, 20, 20);
    TextBlock textBlock = new TextBlock();
    textBlock.Margin = new Thickness(-370,0,0,0);
    textBlock.Text = $"{tiffImage.index.ToString()}"; // Header text

    RenderOptions.SetBitmapScalingMode(imagePreviewItem, BitmapScalingMode.HighQuality);
    imagePreviewItem.Name = $"Image{tiffImage.index.ToString()}";


    imagePreviewItem.Source = tiffImage.image.Thumbnail;

    StackPanel stackPanel = new StackPanel();
    stackPanel.Width = imagePreviewItem.Width + 50;
    stackPanel.Height = imagePreviewItem.Height + 50;
    stackPanel.Children.Add(textBlock);
    stackPanel.Children.Add(imagePreviewItem);

    Border border = new Border();
    border.BorderBrush = Brushes.LightGray;
    border.BorderThickness = new Thickness(1);
    Thickness margin = border.Margin;
    border.Margin = new Thickness(20, 20, 20, 20); ;
    border.Child = stackPanel;
    Grid.SetColumn(border, columnIndex);
    Grid.SetRow(border, rowIndex);

    gridPreview.Children.Add(border);
}

【问题讨论】:

  • 请不要在代码中构建 UI。在 WPF 中,您应该使用 XAML 以声明方式执行此操作。
  • 用于显示元素的集合,例如如果是图像集合,请使用 ItemsControl(或 ListBox 之类的子类)。在用作 ItemsControl 的 ItemTemplate 的 DataTemplate 中为单个项目创建 UI。见Data Templating Overview
  • 感谢您的建议,我对 WPF 和 C# 很陌生,所以我创建了可怕的编码。我会在你的帮助下提高我的技能。

标签: c# wpf image textblock stackpanel


【解决方案1】:

不要将带有数字的textBlock添加到stackPanel中,而是将其添加到左上角border顶部的gridPreview中:

foreach (var tiffImage in tiffImageList)
{
    if (columnIndex == columnAmount)
    {
        columnIndex = 0;
        rowIndex++;
    }

    Image imagePreviewItem = new Image();
    imagePreviewItem.Margin = new Thickness(20, 20, 20, 20);
    TextBlock textBlock = new TextBlock();
    textBlock.VerticalAlignment = VerticalAlignment.Top;
    textBlock.HorizontalAlignment = HorizontalAlignment.Left;
    textBlock.Margin = new Thickness(40, 40, 40, 40);
    textBlock.Text = $"{tiffImage.index.ToString()}"; // Header text

    RenderOptions.SetBitmapScalingMode(imagePreviewItem, BitmapScalingMode.HighQuality);
    imagePreviewItem.Name = $"Image{tiffImage.index.ToString()}";
    imagePreviewItem.Source = tiffImage.image.Thumbnail;

    StackPanel stackPanel = new StackPanel();
    stackPanel.Width = imagePreviewItem.Width + 50;
    stackPanel.Height = imagePreviewItem.Height + 50;
    stackPanel.Children.Add(imagePreviewItem);

    Border border = new Border();
    border.BorderBrush = Brushes.LightGray;
    border.BorderThickness = new Thickness(1);
    Thickness margin = border.Margin;
    border.Margin = new Thickness(20, 20, 20, 20);
    border.Child = stackPanel;
    Grid.SetColumn(border, columnIndex);
    Grid.SetRow(border, rowIndex);

    Grid.SetColumn(textBlock, columnIndex);
    Grid.SetRow(textBlock, rowIndex);

    gridPreview.Children.Add(border);
    gridPreview.Children.Add(textBlock);
}

【讨论】:

  • 非常感谢您的回答,当然有帮助。起初它没有用,但我改变了 textBlock.Margin = new Thickness(-1, 20, 40, 40);它奏效了。也许,这不是优雅和正确的解决方案,但至少,它有效。
猜你喜欢
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多