C# 仅从画布中删除坐标系统
我想用坐标系在画布上画一棵树。我还没能画出树本身,目前我正试图让坐标系更灵活一点,所以当我调整窗口和其中画布的大小时,它会被重新绘制。(这意味着扩展/缩小它的轴,而不是比例。) 我已经阅读了一些关于canvas及其子元素删除的主题,我找到了一个解决方案。问题是这个解决方案对我来说并没有那么好,因为它在每次调整大小事件中只删除坐标系的一行 所有用于绘制坐标系的线都获得了以C# 仅从画布中删除坐标系统,c#,wpf,canvas,resize,coordinate-systems,C#,Wpf,Canvas,Resize,Coordinate Systems,我想用坐标系在画布上画一棵树。我还没能画出树本身,目前我正试图让坐标系更灵活一点,所以当我调整窗口和其中画布的大小时,它会被重新绘制。(这意味着扩展/缩小它的轴,而不是比例。) 我已经阅读了一些关于canvas及其子元素删除的主题,我找到了一个解决方案。问题是这个解决方案对我来说并没有那么好,因为它在每次调整大小事件中只删除坐标系的一行 所有用于绘制坐标系的线都获得了以CoordinationSystemin开头的UID 目前我的代码是: Canvas = Anzeige; private vo
CoordinationSystemin
开头的UID
目前我的代码是:
Canvas = Anzeige;
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (MainWindowLoaded)
{
foreach (UIElement Element in Anzeige.Children)
{
if (Element.Uid.StartsWith("CoordinateSystemIn"))
{
Anzeige.Children.Remove(Element);
}
}
Stift.DrawCoordinateSystem(Anzeige.ActualWidth, Anzeige.ActualHeight, 25);
}
}
是否有其他解决方案可以一次重新绘制整个坐标系,而不是在每次调整大小事件中一行一行地重新绘制?也许您希望使用的是。这将自动完成所有的大小调整(无需一行程序代码)。举个例子:
<Viewbox>
<Path StrokeThickness="1" Stroke="Black" Data="M0,0 L25,25 M0,25 L25,0"/>
</Viewbox>
这里我们有一个简单的路径
'X'来表示您的画布
内容。最初它非常小,或者没有视图框
,只有25 X 25像素。但是,一旦进入视图框
,它就可以自动填充提供的空间。您可能还会发现拉伸
和拉伸方向
属性对您很有用
只需将您的
Canvas
添加到ViewBox
中,并对其进行实验,看看它是否满足您的需要。将您的Canvas
放入ViewBox
中,后者将自动调整画布的大小至适当的大小。您的代码可能如下所示:
<Window x:Class="WpfAccessControlFromResources.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Viewbox>
<Canvas Width="80"
Height="80">
<Path Stroke="DarkGray">
<Path.Data>
<GeometryGroup>
<EllipseGeometry RadiusX="40" RadiusY="40" Center="40, 40" />
<LineGeometry StartPoint="15, 40" EndPoint="65, 40" />
<LineGeometry StartPoint="40, 15" EndPoint="40, 65" />
</GeometryGroup>
</Path.Data>
</Path>
</Canvas>
</Viewbox>
</Window>
请注意,这只是一个草图,而不是整个课程。在这种情况下,如果愿意,还可以集成缩放因子和坐标系原点的平移
无论如何,尽管这个解决方案在关注点分离方面可能是最干净的,但它也需要对WPF布局系统有很好的理解,并需要进行大量的工作和测试。您可以在此处阅读有关此主题的更多信息:为什么不使画布自动调整大小?这是什么意思@Rangi的意思是您可以使用ViewBox,但它似乎无法解决您的问题听起来更像是OP只是想绘制更长或更短的坐标系轴,而不是仅仅直观地缩放画布。另外想想记号。我试着使用你的Viewbox想法,但它使我的整个画布失去了形状。我做错什么了吗?我的wpf代码现在看起来是这样的:编辑:哦,我看到注释不支持代码:S我希望你无论如何都能阅读它@克莱门斯你是对的,我只是试着展开坐标轴,而不是比例本身谢谢你的快速回答,但这只会缩放我的坐标系,我试着展开坐标轴对不起,我误解了你的问题。当你谈到坐标系时,我以为你指的是
Canvas.Top
和Canvas.Left
(并不是说你真的想在屏幕上画一条路径)。哇。谢谢,我想我必须对这件事进行更深入的调查,因为我刚刚开始了第二年的学徒生涯。无论如何,谢谢你的时间和帮助!:)
public class CoordinateSystem : Panel
{
// This element will display the actual coordinate system
// It must be added to the collection of InternalChildren
private Path _coordinateSystemPath;
// This method is used to determine how much space the children want to have
protected override Size MeasureOverride(Size availableSize)
{
Size infiniteSize = new Size(double.PositiveInfinity, double.PositiveInfinity);
Size desiredSize = new Size();
// Measure how many space the items you want to display need
foreach (var child in InternalChildren)
{
child.Measure(infiniteSize);
// Check at which position this child wants to be and
// calculate the desired size of the coordinate system
}
return desiredSize;
}
// this method will arrange the path for the coordinate system as well as
// all the children that will be displayed
protected override Size ArrangeOverride(Size finalSize)
{
foreach (var child in InternalChildren)
{
if (child == _coordinateSystemPath)
{
// Update the PathGeometry of this path according to provided finalSize here
continue;
}
child.Arrange(child.DesiredSize);
}
}
}