C# 仅从画布中删除坐标系统

C# 仅从画布中删除坐标系统,c#,wpf,canvas,resize,coordinate-systems,C#,Wpf,Canvas,Resize,Coordinate Systems,我想用坐标系在画布上画一棵树。我还没能画出树本身,目前我正试图让坐标系更灵活一点,所以当我调整窗口和其中画布的大小时,它会被重新绘制。(这意味着扩展/缩小它的轴,而不是比例。) 我已经阅读了一些关于canvas及其子元素删除的主题,我找到了一个解决方案。问题是这个解决方案对我来说并没有那么好,因为它在每次调整大小事件中只删除坐标系的一行 所有用于绘制坐标系的线都获得了以CoordinationSystemin开头的UID 目前我的代码是: Canvas = Anzeige; private vo

我想用坐标系在画布上画一棵树。我还没能画出树本身,目前我正试图让坐标系更灵活一点,所以当我调整窗口和其中画布的大小时,它会被重新绘制。(这意味着扩展/缩小它的轴,而不是比例。)

我已经阅读了一些关于canvas及其子元素删除的主题,我找到了一个解决方案。问题是这个解决方案对我来说并没有那么好,因为它在每次调整大小事件中只删除坐标系的一行

所有用于绘制坐标系的线都获得了以
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);
        }
    }
}