Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用XAML/WPF实现复杂曲线编辑器的策略

用XAML/WPF实现复杂曲线编辑器的策略
EN

Stack Overflow用户
提问于 2011-03-11 10:12:07
回答 1查看 3.1K关注 0票数 7

我想实现一个相当复杂的CurveEditor,它必须支持通常的需求,如:

  • 可自由伸缩和可移动的轴
  • 每个曲线点的不同插值类型(线性、三次、样条)
  • 切线(连接和断裂)
  • 选择一个或几个点,通过栅栏或单击编辑(移动、缩放、删除)
  • 仅显示选定曲线点的句柄和突出显示

我不想操作实际的WPF曲线,而是一个具有键/值/切线集的现有模型,并从我们的实现中对曲线的精确形状进行采样。

我已经积累了一些实现自定义UserControls和模板的经验。但我要确保,我不会错过任何明显的解决方案。我计划有一个通用的XAML树:

  • CurveEditor -保存所有内容的窗口
    • MainThumb:启用拖动和缩放编辑器范围
    • XAxis:在左侧绘制一些比例尺的UserControl
    • YAxis:在底部绘制一些比例尺的UserControl
    • 曲线:容纳曲线的画布
      • 曲线:单曲线的UserControl
        • CurveName -曲线标号
        • CurveLine - DrawingVisual,它将通过采样样条函数的内部实现来呈现实际曲线。
        • CurveEditPoints -画布,保存所有编辑点
          • 用于单个编辑点的CurveEditPoint - UserControl
          • 左切线手柄的LeftTangent - UserControl
          • LeftTangentThumb -用于修改句柄

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            - **RightTangent** - UserControl for the right tangent handle  
            - **RightTangentThumb** - For modifying the handle

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            - **CurvePointCenter** - Visualisation of the actual point, select state and interpolation type.  
            - **CurvePointThumb** - Thumb to select and drag point around

我知道,这是一个相当复杂的问题,我并不是要求实际执行。我对以下问题感兴趣:

  1. 你能推荐一些可能对我有帮助的教程或书籍吗(我已经得到了插图WPF、WPF控件开发以及其他几本)。
  2. 像切线这样的次要元素应该是单独的UserControls吗?
  3. 什么样的容器最适合承载个人“曲线”、"EditPoints“和”切线“。现在,我用画布和Canvas.etLeft/SetTop来定位孩子们,但这感觉很“奇怪”。
  4. 我是否应该使用“形状”(如Path或DrawingVisual类)来实现实际表示。Path是直截了当的,但我关心的是数百个CurvePoints的性能。
  5. 我是应该使用转换来旋转切线,还是只是在文件后面的代码中做一些三角剖分的数学?
  6. 这种结构是否大致合理,或者你是否建议了一种完全不同的方法?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-14 05:33:03

  1. 您似乎手头有正确的工具,WPF释放是优秀的,但我想您已经有了这个工具。
  2. 在其中一种情况下制作单独的UserControls:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- you are using the same xaml all over the place (DRY)
- you xaml file gets too big (get some components out)
- you _need_ to inherit from some class

  1. 这取决于你想要多少代码。 正如您在注释中建议的那样,您可以使用ItemsControl作为容器,用于需要在多个项之间进行选择的任何地方。因此,这也可以在曲线的水平上进行,而不仅仅是在曲线上的点的水平上。根据您想要处理的实际线条和曲线的绘制方式,您甚至可以为这些绘制一个ItemsControl。(顺便提一句:您将不会有虚拟化,虽然,因为您的项目将不会有一个恒定的高度)
  2. 路径可以使用数百个CurvePoints。如果你有10.000,我会说你会有麻烦的。
  3. 无法想象如何在这里使用转换,也许在Adorner内部。
  4. 你的结构看起来不错。您将能够实现所有这些。不过,我会建议我如何去做:

首先使用MVVM。

  • CurveEditor ListBox(Panel=Canvas)(ItemsSource=Curves)(ItemTemplate=CurveControl)
  • CurveControl
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- Canvas(Background=Transparent) <= I'm not sure if standard is white, but you don't want to overlap other Curves...  
    - CurveName
    - ListBox(Panel=Canvas(Background=Transparent))(ItemsSource=CurveParts)
    - ListBox(Panel=Canvas(Background=Transparent))(ItemsSource=CurvePoints)(ItemTemplate=>EditPointControl)

  • EditPointControl
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- Canvas  
    - Thumb(Template = Ellipse) (Name=CenterHandle) (with some Visualstates for Selection and hiding of Tangents)
    - Thumb(Template = Ellipse) (Name=LeftHandle)
    - Thumb(Template = Ellipse) (Name=RightHandle)
    - Line (Binding X/Y to Centerpoint and LeftHandlePoint)
    - Line (Binding X/Y to Centerpoint and RightHandlePoint)

我已经声明将ItemTemplate设置为ListBox。不过,您可以随意设置列表框的样式(我认为标准样式包括一个边框,您可能希望删除该边框或设置bordersize=0),并将其设置为ItemTemplate ( ItemContainerStyle ),并绑定到IsSelected,这样您就可以从ViewModel中控制IsSelected (我的意思是查看这里 )。

视图模型如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- CurveEditorViewModel
    - ObservableCollection<CurveViewModel> Curves


- CurveViewModel
    - string Label
    - (Point LabelPlacement)
    - bool IsSelected
    - ObservableCollection<CurvePointViewModel> CurvePoints
    - ObservableCollection<CurvePartViewModel> CurveParts


- CurvePointViewModel
    - Point Position
    - bool IsSelected
    - Point LeftHandle
    - Point RightHandle

- CurvePartViewModel
    - CurvePointViewModel StartPoint
    - CurvePointViewModel EndPoint
    - Path CurvePath

在这里,您可以订阅CurvePointViewModel的PropertyChanged并重新计算您要公开的路径。

我可能会改进我的做法,但这将是我的第一猜测。

有些细节你可能需要留心。拇指的样式可能是中间的一个可见的圆圈,和background=transparent周围的一个看不见的更大的圆圈。这样,你就可以让你的可见圈小,但让用户使用在一个区域周围的小圆圈。

编辑

下面是拇指的一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        <Thumb Width="8" Height="8" Cursor="Hand" Margin="-4">
            <Thumb.Template>
                <ControlTemplate TargetType="Thumb">
                    <Grid>
                        <Ellipse Fill="Transparent" Margin="-6"/>
                        <Ellipse Stroke="Red" StrokeThickness="2"/>
                    </Grid>
                </ControlTemplate>
            </Thumb.Template>
        </Thumb>

当您希望将其定位在画布上的特定点时,将边距设置为减去宽度和高度的一半,将圆心放置在该点上。此外,有一个透明的填充和边缘为-6的内椭圆,你将得到一个6px更大的半径围绕在中心(较小的)圆圈,你可以拖动拇指。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5276701

复制
相关文章
Golang计算两个经度和纬度之间的距离
Go语言计算两个经度和纬度之间的距离 package main import ( "fmt" "math" ) func main() { lat1 := 29.490295 lng1 := 106.486654 lat2 := 29.615467 lng2 := 106.581515 fmt.Println(EarthDistance(lat1, lng1, lat2, lng2)) } func EarthDistance(lat1, lng1, lat2, lng
大师级码师
2021/11/02
2.6K0
已知两点的经度和纬度,计算两点间的距离(php,javascript)
php代码:转载  http://www.cnblogs.com/caichenghui/p/5977431.html
lin_zone
2018/08/15
7830
【Java AWT 图形界面编程】经度 Longitude 、纬度 Latitude 计算 ( 经度、纬度概念 | 根据经纬度计算距离 )
经度 Longitude , 本初子午线 位置 为 0 度经线 , 相当于水平 x 轴 的坐标 , 经度的取值范围 -180 度 ~ +180 度 ;
韩曙亮
2023/03/25
7790
【Java AWT 图形界面编程】经度 Longitude 、纬度 Latitude 计算 ( 经度、纬度概念 | 根据经纬度计算距离 )
百度地图JavaScript API获取用户当前经纬度和详细地理位置,反之通过详细地理位置获取当前经纬度
  前端时间刚好使用了百度地图的js api定位获取用户当前经纬度并获取当前详细位置和通过当前用户详细地理位置换取用户当前经纬度坐标的功能,为了方便下次找起来方便一些自己在这里记录一下,希望也能够帮助到有需要的童鞋们!
追逐时光者
2019/08/28
7.2K0
根据位置、经纬度获取天气API
https://seniverse.yuque.com/books/share/ded1e167-e35c-4669-8306-cf65c6e01dc0/start
莫空9081
2021/06/02
6.9K0
通过IP地址获取当前地理位置的接口(包含纬经度)
直接访问:https://api.liguangchun.cn/api/v7/ip/ 就可以查询到了
李光春
2018/09/18
3.5K0
HTML5的Geolocation API
Geolocation API用于将用户当前地理位置信息共享给信任的站点,这涉及用户的隐私安全问题,所以当一个站点需要获取用户的当前地理位置,浏览器会提示用户是“允许” or “拒绝”。
meteoric
2018/11/15
1.5K0
JavaScript与jQuery获取元素的宽、高和位置
今天汇总整理了 JavaScript 和 jQuery 获取元素宽高和位置的方法,比较全面,方便自己和需要并搜到此文章的朋友们查看。
德顺
2019/11/13
3.1K0
第182天:HTML5——地理定位
HTML5 Geolocation API 用于获得用户的地理位置。 鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的。
半指温柔乐
2018/09/11
2K0
第182天:HTML5——地理定位
JavaScript 中获取光标位置
DOM中并没有直接获取光标位置的方法,那么我们只能间接来获取光标位置。DOM支持获取光标选中的范围,我们可以以此为切入点,来获取或定位光标的位置,当选取范围起始点和结束点一样时,就是光标插入的位置。
越陌度阡
2020/11/26
12.5K0
【Java 进阶篇】JavaScript BOM(浏览器对象模型)详解
BOM,即浏览器对象模型(Browser Object Model),是JavaScript与浏览器之间的接口,它允许JavaScript与浏览器进行交互,实现访问和控制浏览器窗口、文档和其他浏览器功能的功能。本文将详细介绍BOM的各个方面,包括窗口对象、定时器、历史记录、位置信息等,并提供示例代码来帮助您更好地理解和运用BOM。
繁依Fanyi
2023/10/19
6790
用Javascript获取页面元素的位置
制作网页的过程中,你有时候需要知道某个元素在网页上的确切位置。 下面的教程总结了Javascript在网页定位方面的相关知识。 一、网页的大小和浏览器窗口的大小 首先,要明确两个基本概念。 一张网页的全部面积,就是它的大小。通常情况下,网页的大小由内容和CSS样式表决定。 浏览器窗口的大小,则是指在浏览器窗口中看到的那部分网页面积,又叫做viewport(视口)。 很显然,如果网页的内容能够在浏览器窗口中全部显示(也就是不出现滚动条),那么网页的大小和浏览器窗口的大小是相等的。如果不能全部显示,则滚动浏览器
ruanyf
2018/04/12
3.3K0
小程序地图学习之获取位置 获取经纬度 获取地名 获取地址
我们在做小程序开发时,难免会遇到地图相关的开发,而小程序已经为我们提供的比较完善的地图组件。我们只需要调用相关的api就可以实现大致的功能。如:获取经纬度,获取位置,获取地址,获取地名。接下来就具体给大家讲解
编程小石头
2020/10/22
1.8K0
小程序地图学习之获取位置 获取经纬度 获取地名 获取地址
【Go 语言社区】HTML5 Geolocation(地理定位)-转
HTML5 Geolocation(地理定位)用于定位用户的位置。 ---- 定位用户的位置 HTML5 Geolocation API 用于获得用户的地理位置。 鉴于该特性可能侵犯用户的隐私,除非用
李海彬
2018/03/20
2.5K0
GIS数据漫谈(三)
赤道把地球分为了北半球和南半球,与赤道平行的线就是纬线。赤道是最大的纬圈,由此向北或向南,纬圈半径递减。赤道纬度为 0°,由赤道向两级各分为90°。
thingjs
2022/07/12
1.8K0
GIS数据漫谈(三)
第127天:移动端-获取触摸点的位置
$("#demoid").bind('touchstart',function(){ //代码处理});
半指温柔乐
2018/09/11
1.5K0
第127天:移动端-获取触摸点的位置
实践:了解Redis Geo范围查询,获取当前位置最近的经纬度点
近期有个获取车辆所处道路的需求,车辆行驶的范围在一个城市的市区内,针对一个城市的道路经纬度节点的数据量会比较大(就济南市而言,目前数据量在20万左右),数据的准确性以及检索效率是首要考虑的问题。
恒宇少年
2021/04/12
3.1K0
WebView处理网页位置请求
随着移动设备的激增,LBS(Location Based Service)已然成为趋势,其最关键的还是获取设备的位置信息。native代码获取位置信息轻轻松松可以搞定,实际上网页获取位置信息也不是那么困难。
技术小黑屋
2018/09/04
1.3K0
点击加载更多

相似问题

获取位置(纬度和经度)

20

获取位置的纬度和经度

10

获取位置的纬度和经度

14

无法获取用户位置的经度和纬度

11

无法映射纬度和经度位置

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文