1

我有一个带有GeometryModel3D数据绑定的 WPF 控件。DiffuseMaterialImageBrushImageSource

我的目标是在鼠标悬停时显示“横截面”,为此我已经可以在对象上获得正确的位置。问题是:WPF 中没有“3D 线”。

我做了一个测试,在我使用的图像中画了一条线,ImageSource视觉结果正是我想要的。

所以我打算做以下事情:生成一次基础图像,然后在其上绘制适当的线,将使用的属性设置为ImageSource.

我考虑了两种方法:

  1. 具有类型的绑定 ImageSource BitmapImage。然后我用空白纹理(没有线条)创建System.Drawing.Bitmap一次,然后每次我想要线条改变位置时,我用;重新创建BitmapImage线条。System.Drawing.Graphics

  2. 具有类型的绑定 ImageSource DrawingGroup。然后我创建了System.Windows.Media.ImageDrawing一次,然后每次我希望线改变位置时,我DrawingGroup通过仅更改GeometryDrawing由单行组成的来重新创建。

一种方法比另一种方法有什么内在优势吗?

4

2 回答 2

1

我必须承认我从未真正测试过性能差异,但我知道Drawing该类能够以轻量级的方式来操作基本形状和图像。从 MSDN 上的Drawing页面:

绘图对象是轻量级对象,可让您将几何形状、图像、文本和媒体添加到应用程序。绘图对象被认为是轻量级的,因为它们不提供对布局、输入概览和焦点的支持。由于它们的性能优势,绘图是背景和剪贴画的理想选择。在 Visual 级别进行编程时,您还可以使用绘图。

相反,BitmapImage该类内置了各种额外的额外功能和便利特性,使其不如Drawing该类轻量级。从 MSDN 上的成像概述页面:

BitmapImage 是一种专门的 BitmapSource,它针对可扩展应用程序标记语言 (XAML) 加载进行了优化,并且是一种将图像显示为 Image 控件的 Source 的简单方法。

于 2014-01-10T14:29:39.490 回答
0

我最终用一种非常 WPF/XAML 友好的方式来替换旧的基于 GDI+ 的“位图上的图形,然后转换为 BitmapImage Drawing”很多代码隐藏。

该行本身是硬编码的,其Geometry.Transform.Y属性由使用alturaFatia名称的代码隐藏事件直接设置。

<DiffuseMaterial>
    <DiffuseMaterial.Brush>
        <ImageBrush>
            <ImageBrush.ImageSource>
                <DrawingImage>
                    <DrawingImage.Drawing>
                        <DrawingGroup>
                            <DrawingGroup.ClipGeometry>
                                <RectangleGeometry Rect="{Binding LimitesMapa}" />
                            </DrawingGroup.ClipGeometry>
                            <ImageDrawing x:Name="MapaAtivo"
                                ImageSource="{Binding MapaAtivo}" Rect="{Binding LimitesMapa}"/>
                            <GeometryDrawing>
                                <GeometryDrawing.Pen>
                                    <Pen Thickness="2" Brush="Blue"/>
                                </GeometryDrawing.Pen>                                                              
                                <GeometryDrawing.Geometry>
                                    <LineGeometry>
                                        <LineGeometry.StartPoint>
                                            <Point X="-200" Y="0"/>
                                        </LineGeometry.StartPoint>
                                        <LineGeometry.EndPoint>
                                            <Point X="200" Y="0" />
                                        </LineGeometry.EndPoint>
                                        <LineGeometry.Transform>
                                            <TranslateTransform x:Name="alturaFatia" Y="-200" />
                                        </LineGeometry.Transform>
                                    </LineGeometry>
                                </GeometryDrawing.Geometry>
                            </GeometryDrawing>
                        </DrawingGroup>
                    </DrawingImage.Drawing>
                </DrawingImage>
            </ImageBrush.ImageSource>
        </ImageBrush>
    </DiffuseMaterial.Brush>
</DiffuseMaterial>
于 2014-01-10T20:28:35.073 回答