将 LineGeometry 与 EllipseGeometry 组合(在代码中,而不是 XAML)

2023-12-07

我正在尝试使用 WPF 创建自定义形状。对于初学者来说,我只是想创建一条简单的线,两端都有一个圆圈(我知道有 LineCaps,但这不是我要找的)。

我研究了一些教程,最简单的方法似乎是使用CombinedGeometry。但是我无法让它正常工作。这是我创建几何对象的代码:

protected override Geometry DefiningGeometry
    {
        get
        {
            Point ellipseCenter1 = new Point(X1 - this.CapDiameter / 2, Y1 - this.CapDiameter / 2);
            Point ellipseCenter2 = new Point(X2 - this.CapDiameter / 2, Y2 - this.CapDiameter / 2);
            var ellipse1 = new EllipseGeometry(ellipseCenter1, CapDiameter, CapDiameter);
            var ellipse2 = new EllipseGeometry(ellipseCenter2, CapDiameter, CapDiameter);
            var line = new LineGeometry(this.StartPoint, this.EndPoint);

            var combined1 = new CombinedGeometry(GeometryCombineMode.Union, ellipse1, line);
            var combined2 = new CombinedGeometry(GeometryCombineMode.Union, combined1, ellipse2);

            // Freeze the geometry for performance benefits
            combined2.Freeze();

            return combined2;
        }
    }

然而,由于某种原因,这并没有划清界限。它画了两个圆,但不画线。显然我在这里遗漏了一些东西,有人能指出什么吗? :)

以防万一,以下是班级的其余部分:

#region Dependency Properties
public static readonly DependencyProperty X1Property = 
    DependencyProperty.Register(
        "X1", 
        typeof(double),
        typeof(CappedLine), 
        new FrameworkPropertyMetadata(
                0.0, 
                FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure
            )
    );
public static readonly DependencyProperty Y1Property =
    DependencyProperty.Register(
        "Y1",
        typeof(double),
        typeof(CappedLine),
        new FrameworkPropertyMetadata(
                0.0,
                FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure
            )
    );
public static readonly DependencyProperty X2Property =
    DependencyProperty.Register(
        "X2",
        typeof(double),
        typeof(CappedLine),
        new FrameworkPropertyMetadata(
                0.0,
                FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure
            )
    );
public static readonly DependencyProperty Y2Property =
    DependencyProperty.Register(
        "Y2",
        typeof(double),
        typeof(CappedLine),
        new FrameworkPropertyMetadata(
                0.0,
                FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure
            )
    );
public static readonly DependencyProperty CapDiameterProperty =
    DependencyProperty.Register(
        "CapDiameter",
        typeof(double),
        typeof(CappedLine),
        new FrameworkPropertyMetadata(
                0.0,
                FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure
            )
    );

#endregion
#region CLR Properties

public double X1
{
    get { return (double)base.GetValue(X1Property); }
    set { base.SetValue(X1Property, value); }
}

public double Y1
{
    get { return (double)base.GetValue(Y1Property); }
    set { base.SetValue(Y1Property, value); }
}

public double X2
{
    get { return (double)base.GetValue(X2Property); }
    set { base.SetValue(X2Property, value); }
}

public double Y2
{
    get { return (double)base.GetValue(Y2Property); }
    set { base.SetValue(Y2Property, value); }
}

public Point StartPoint
{
    get { return (new Point(X1, Y1)); }
}

public Point EndPoint
{
    get { return (new Point(X2, Y2)); }
}

public double CapDiameter
{
    get { return (double)base.GetValue(CapDiameterProperty); }
    set { base.SetValue(CapDiameterProperty, value); }
}

#endregion

这是XAML我用来测试它的代码:

<Window x:Class="HG.WPF.Shapes.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:shapes="clr-namespace:Tomers.WPF.Shapes"

    Title="WPF Custom Shapes" Height="300" Width="300" ResizeMode="NoResize">

    <Canvas Background="Black">
        <shapes:CappedLine X1="30" Y1="30" X2="200" Y2="200" CapDiameter="5" Fill="White" Stroke="White" StrokeThickness="2"></shapes:CappedLine>        
    </Canvas>

</Window>

Your LineGeometry如果你尝试,物体就会消失Union他们。来自 MSDN:

GeometryCombineMode 属性指定两个几何图形将如何组合 被合并。请注意,CombinedGeometry 组合了由 两个几何图形,因此没有面积的几何图形(例如 LineGeometry) 组合后消失。

您可以使用GeometryGroup:

GeometryGroup combined = new GeometryGroup();
combined.Children.Add(ellipse1);
combined.Children.Add(ellipse2);
combined.Children.Add(line);

或者你可以使用CombinedGeometry首先在椭圆对象上,然后使用将其与直线分组在一起GeometryGroup.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 LineGeometry 与 EllipseGeometry 组合(在代码中,而不是 XAML) 的相关文章

  • .Net Core 中 String 默认不可序列化吗?

    我正在查看其他的 Fortify 静态分析安全测试 SAST 扫描报告 以识别和抑制误报 应用程序框架是C NET Core SAST 报告部分内容如下 Method1 在第 111 行将不可序列化的对象存储为 HttpSessionSta
  • 请求的资源不支持 HTTP 方法“GET”

    我的路线配置正确 并且我的方法具有装饰标签 我仍然收到 请求的资源不支持 HTTP 方法 GET 消息 System Web Mvc AcceptVerbs GET POST System Web Mvc HttpGet public st
  • 如何在函数中将结构成员作为指针传递?

    问题是我有一个结构是另一个 主要 结构的成员 我编写了一个函数来清除第一个结构 它需要一个指向结构的指针 我想使用该函数来清除主要结构内的结构 但我不确切知道哪种方法是正确的 为了更好地解释它 这里有一些代码 我有一个结构 定义为 type
  • 根据另一个列表的内容对列表进行排序

    我有一个包含整数列表的列表和另一个包含同时包含整数和字符串的类的列表 我想做的是按字母顺序对列表进行排序 将第一个列表中存在的条目放在前面 这是我的代码和预期输出 using System using System Collections
  • C# 动态 Linq 变量Where 子句

    我正在按照 Scott Gu 的文章创建动态 LINQhttp weblogs asp net scottgu archive 2008 01 07 dynamic linq part 1 using the linq dynamic qu
  • 将 Visual Studio 2012 C++ 单元测试项目链接到 exe 会导致访问冲突

    我从现有的整体 exe 本机 Visual Studio 2012 项目开始 我想添加一个本机单元测试项目 根据http msdn microsoft com en us library hh419385 aspx objectRef ht
  • 堆栈独立的C/C++蓝牙API?

    我想知道是否有适用于 Windows XP Vista 7 x86 和 x64 的堆栈独立 C C 蓝牙 api 我的目标是创建连接并通过蓝牙发送 接收一些时间关键的数据 我的研究给了我以下选择以及这项任务的缺点 用于蓝牙的 Windows
  • 输入缓冲区刷新

    考虑下面的代码 include
  • 当应用程序未聚焦时监听按键

    我有一个应用程序 C 4 0 WPF 它是隐藏的 可以通过单击系统托盘图标或我创建的其他框架 停靠在左侧和最上面的小框架 来显示 My customer wants to add a new way to display the appli
  • C#中如何将委托转换为对象?

    我正在使用反射类来调用其他 dll 上的一些方法 方法的参数之一是委托类型 我想通过使用反射来调用这个方法 所以我需要将函数参数作为对象数组传递 但我找不到任何关于 如何将委托转换为对象 提前致谢 委托是一个对象 只需像平常一样创建预期的委
  • 那里有更好的 DateTime.Parse 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道有一个库 付费或免费 能够处理比 DateTime Parse 使用的更常见的日期时间格式 能够
  • 如何计算某物是否位于某人的视野中

    我有一个对象 它在 2D 空间中具有位置和速度 两者都由向量表示 对象的视野每侧均为 135 度 它看起来与移动的方向相同 速度矢量 我有一些对象 其在 2D 空间中的位置由向量表示 在图中 蓝色背景上的对象是可见的 红色背景上的对象对主体
  • XPath 选择具有特定属性值的元素?

    我在使用 XPath 选择节点时遇到问题 我将展示一个示例 由于实际数据量很大 xml 文件被缩短了 这是 XML 的子集
  • C++ 静态工厂构造函数

    我正在进行模拟 它需要创建多个相当相似的模型 我的想法是有一个名为 Model 的类并使用静态工厂方法来构造模型 例如 模型 createTriangle or 模型 createFromFile 我从以前的 java 代码中汲取了这个想法
  • “sizeof”对不完整类型列表结构 C 的无效应用

    我正在尝试实现一种处理页面错误的替换算法 因此 我尝试使用 malloc 创建一个循环链表 但出现以下错误 无效的应用程序sizeof to incomplete typepageInMemory 以下是代码 typedef struct
  • g++4.9 不支持 std::align

    在学习对齐问题等时 我意识到我的 g 4 9 macports OS X 实现不支持std align 如果我尝试编译 使用 std c 11 此示例代码来自http www cplusplus com reference memory a
  • 是否可以从.NET Core中间件检索控制器的操作结果?

    public class UsersController APIControllerBase public UsersController public Client Get return new Client ClientID 1 Las
  • 从哪里开始阅读 SQLite 源代码? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想了解sqlite是如何实现的 并且 想阅读源代码 我已经下载了源代码 我应该开始查看代码的哪一部分 SQLite文档页 http
  • 构建 OpenCV 时出错 :: MonitorFromRect 未在此范围内声明

    我试图建立OpenCV version 2 4 8与它一起使用CodeBlocks and MinGw 我按照以下指示进行操作here http kevinhughes ca tutorials opencv install on wind
  • AddressAccessDeniedException :无需 netsh 即可解决它?

    我遇到了异常AddressAccessDeniedException因为我的processus没有注册URL的权限 我首先以管理员身份运行我的程序 好的 它成功了 但我现在想要分发我的应用程序 并且我希望每个用户都能够运行它 而不必成为管理

随机推荐

  • Flutter:语法错误:JSON 中位置 0 处出现意外标记 <

    我需要从 API 获取数据 但我的 try catch 失败并出现 SyntaxError Unexpected token Code String problems try final response await http get ht
  • 在Python中将字符串转换为元组

    好的 我有这个字符串 tc 107 189 我需要它是一个元组 这样我就可以一次将每个数字称为一 print tc 0 needs to output 107 先感谢您 所有你需要的是ast literal eval gt gt gt fr
  • 如何在多个.cpp文件中使用全局变量?

    我有一个简单的程序 它尝试在单独的文件中打印我的全局变量 我正在使用Visual Studio 2013 专业版 IDE print h ifndef PRINT H define PRINT H void Print endif 打印 c
  • ELMAH 异常生成通用“服务不可用”消息

    我正在尝试创建一个可用性页面 该页面检查站点使用的所有服务 将每个检查包装在 try catch 中 然后向用户显示任何失败 其中一项服务是 ELMAH 因此我调用该服务是为了仔细检查我们是否可以成功记录错误 控制器 var a new A
  • 为什么 jquery 自动完成功能在 https(安全页面)上不起作用?

    我试图让 jquery 自动完成功能在 https 安全页面 页面上工作 但它没有显示任何下拉菜单 我搜索了这个问题 发现它的安全问题 谁能告诉我如何在 https 页面上打开此自动完成下拉列表 这是我的 jquery 自动完成代码 fun
  • 使用生成器作为子流程输入;出现“对已关闭文件进行 I/O 操作”异常

    我有一个大文件需要在输入另一个命令之前进行处理 我可以将处理后的数据保存为临时文件 但想避免这样做 我编写了一个生成器 它一次处理每一行 然后按照脚本将其作为输入提供给外部命令 但是我在第二轮循环中遇到了 关闭文件上的 I O 操作 异常
  • Oracle 高级队列 - 出队不起作用

    我似乎找不到解决问题的方法 我已经被困在这个问题上几个小时了 我正在使用 Oracle AQ Dbms Aqadm Create Queue Table Queue Table gt ITEM EVENT QT Queue Payload
  • 即使安装了 Pandas 模块也找不到

    我为此使用 anaconda 我已经使用两者下载了 pandas pip install pandas and conda install pandas 安装成功 再次安装显示已经安装 然而 当单独写这一行时 import pandas a
  • 将更多对象提取到实体中后核心数据关系丢失

    我有一个如下所示的核心数据模型 在表格视图中 我加载了所有约会 上一个UILabel在我里面custom cell我将约会地点名称设置如下 NSString info appointment location label vrij 起初一切
  • 通过将元素与先前元素的累积乘积相乘来创建列

    我有一个向量 df lt c 1000 1 02 1 03 1 04 1 01 我想创建一个新向量 其中包含 df 旧向量 中元素的累积乘积 新列应该看起来像 b lt c 1020 1050 6 1092 64 1103 5 基本上 新向
  • 从另一方收到不安全或不正确安全的故障

    我有一个调用 WCF 服务的 Windows 程序 该服务几次后会变得非常慢 最终会遇到此错误 再次重启后服务再次启动 真挚地 您可能没有关闭与 WCF 服务的连接 WCF 默认有 10 个连接 超时为一分钟 然后发生的事情是前 10 个点
  • 动态更改自动布局

    我必须显示 3 个标签 例如 标签1 标签2 标签3 Horizontally 我想要这 3 个标签的宽度是根据屏幕尺寸宽度均分 如何直接使用 nib 文件实现此目的 Thanks 问题2 标签1 标签2 标签3 所有标签宽度相等 所有La
  • 找不到引用的源:包

    我有这个 pubspec yaml name Dart Pages description The Dart platform dependencies web components any mongo dart any 然后我运行 工具
  • 与计算机同步互联网时间

    所以我制作了一个具有许可证检查功能的程序 该程序仅适用于有限数量的受信任的人 所以我知道他们不会尝试篡改它 我想要做的是将计算机时钟与互联网时间 例如 time windows com 或任何受信任的时间 同步 如果计算机时钟与互联网不匹配
  • 有适用于 GIT 的 PHP api 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想知道是否有任何API或东西可以让php与GIT交互 我想在网页上打印有关分支 存储库等的信息 这可能吗 快速搜索就会找到一个 github 项目
  • 循环删除工作表

    您能告诉我为什么每隔一张工作表都会被删除 但是如果我关闭 worksheets delete 行 消息框中会显示所有工作表名称 Sub tor Dim wsz As Integer wsz Application Worksheets Co
  • TCL 数组最大大小

    我正在开发一个工程应用程序 界面是用TCL TK编写的 一切都很顺利 直到我需要使用一个 非常 大的数组 370 000 000 个元素 每个元素长度为 2 到 10 个字符 线性增长 我的问题是 TCL 阵列的大小限制在哪里 我一直在阅读
  • 使用基于注释的配置创建延迟初始化的 Spring bean

    我正在使用Spring的 Component注释来配置我的 Spring 3 0 应用程序中的许多 bean 我想知道是否可以懒惰地构建其中一些豆子 尤其是prototype beans 要声明延迟初始化的 bean 您可以使用 Lazy注
  • C++ 使用 for 循环反向打印字符串

    我有一个程序 使用 for 循环打印出字符串的字符 它还必须反向打印相同的字符 这就是我遇到问题的地方 有人可以帮我弄清楚为什么第二个 for 循环没有执行吗 int main string myAnimal cout lt lt Plea
  • 将 LineGeometry 与 EllipseGeometry 组合(在代码中,而不是 XAML)

    我正在尝试使用 WPF 创建自定义形状 对于初学者来说 我只是想创建一条简单的线 两端都有一个圆圈 我知道有 LineCaps 但这不是我要找的 我研究了一些教程 最简单的方法似乎是使用CombinedGeometry 但是我无法让它正常工