红着眼 2024-05-02 12:18 采纳率: 27.8%
浏览 3
已结题

WPF 大屏看板表格背景图片设置

WPF怎么用一个png背景作为Border的背景来实现自动填充呢。
难点是Border大小不一致,可能需要对Path元素Geometry或者使用Clip之类的技术。
比如第一个Border代码如下

<Border Width="300" Height="1000"/> 

比如第二个Border代码如下

<Border Width="400" Height="800"/> 

比如第三个Border代码如下

<Border Width="600" Height="300"/> 

png背景如下图

img

想要实现的效果如下图

img

  • 写回答

5条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-05-02 12:19
    关注

    🕒下午好,题主!目前:🟢[在线]
    📢参考通义千问、由郭老师整理提供!
    📣今日诗号:有一美人兮,见之不忘。 一日不见兮,思之如狂。

    要在 WPF 中实现一个动态大小的表格背景,其中每个单元格都有一个根据内容自动扩展的 PNG 背景,同时保持背景图片的填充效果,可以使用 Grid 结构和 VisualBrushImageBrushClipToBounds 属性配合。这里是一个基本的思路和代码示例,但请注意,这只是一个概念性的解决方案,可能需要根据实际需求进行调整:

    1. 首先,确保你的 PNG 背景图是一个可以拉伸的图案,比如有平滑渐变或重复的纹理,因为如果图片有锯齿边缘,拉伸时可能会出现质量下降。

    2. 创建一个 Grid 控件作为容器,用来放置你的表格行和列。

    <Grid x:Name="MyTableGrid">
        <Grid.ColumnDefinitions>
            <!-- 根据需要定义列宽 -->
            <ColumnDefinition Width="Auto" />
            <!-- ...其他列定义... -->
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <!-- 根据需要定义行高 -->
            <RowDefinition Height="Auto" />
            <!-- ...其他行定义... -->
        </Grid.RowDefinitions>
    </Grid>
    
    1. 对于每个单元格,创建一个 GridContentControl 作为单元格内容,并使用 VisualBrushImageBrush 设置背景。例如:
    <Grid Grid.Column="0" Grid.Row="0" ClipToBounds="True">
        <!-- 为了适应不同大小,可以使用 DataTemplate 或然使用一个通用的 CellTemplate -->
        <DataTemplate>
            <Border Background="{TemplateBinding Path=BackgroundBrush}">
                <!-- 这里放你的实际内容,比如 TextBlock 或 Image -->
                <TextBlock Text="单元格内容" />
            </Border>
        </DataTemplate>
    </Grid>
    
    <!-- 假设你有一个依赖属性 BackgroundBrush,用于存储 VisualBrush 或 ImageBrush -->
    public static readonly DependencyProperty BackgroundBrushProperty = DependencyProperty.Register("BackgroundBrush", typeof(Brush), typeof(MyTableCell));
    
    private Brush backgroundBrush;
    public Brush BackgroundBrush
    {
        get { return backgroundBrush; }
        set
        {
            backgroundBrush = value;
            OnPropertyChanged();
        }
    }
    
    // 在构造函数或任何初始化方法中设置初始的 VisualBrush 或 ImageBrush
    BackgroundBrush = new VisualBrush(MyBackgroundImage);
    
    1. 将 PNG 图片转换为 VisualBrush,可以通过将 Image 转换成 DrawingVisual,然后创建 VisualBrush 实例:
    private Image MyBackgroundImage;
    
    public MyBackgroundImage
    {
        // 设置图片路径
        // 这里假设你有一个方法 LoadBackgroundImage() 来加载图片并创建 DrawingVisual
        // MyBackgroundImage = LoadBackgroundImage();
    }
    
    private DrawingVisual CreateVisualFromImage(Image image)
    {
        var drawingContext = new DrawingContext();
        drawingContext.DrawImage(image, new Rect(0, 0, image.Width, image.Height));
        return new DrawingVisual(drawingContext);
    }
    
    public Brush BackgroundBrush
    {
        get
        {
            if (MyBackgroundImage == null)
            {
                // 初始化时加载图片
                MyBackgroundImage = LoadBackgroundImage();
            }
    
            if (MyBackgroundImage != null)
            {
                var visual = CreateVisualFromImage(MyBackgroundImage);
                return new VisualBrush(visual);
            }
            else
            {
                return Brushes.Transparent; // 如果图片未加载,返回透明
            }
        }
    }
    
    1. 当单元格的内容改变时,通过 DependencyPropertyChanged 事件监听器更新 BackgroundBrush 的内容,以保持图片的填充效果。

    这个方案展示了如何使用 VisualBrushClipToBounds 来实现背景图片的填充效果。请注意,对于非常大的图片或者复杂的背景效果,性能可能会有所影响,因为每次内容变化都需要重新渲染背景。如果需要更高效的方法,可能需要考虑使用 BitmapEffect 或者使用 ImageBrushTileMode 属性来处理重复纹理。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月2日
  • 修改了问题 5月2日
  • 创建了问题 5月2日

悬赏问题

  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 angular开发过程中,想要读取模型文件,即图1的335行,会报404错误(如图2)。但我的springboot里配置了静态资源文件,如图3。且在该地址下我有模型文件如图4,请问该问题该如何解决呢?
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了
  • ¥100 H5网页如何调用微信扫一扫功能?
  • ¥15 讲解电路图,付费求解
  • ¥15 有偿请教计算电磁学的问题涉及到空间中时域UTD和FDTD算法结合的
  • ¥15 vite打包后,页面出现h.createElement is not a function,但本地运行正常
  • ¥15 Java,消息推送配置