Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在文本框输入更改时获取要刷新的行大小_C#_Wpf_Xaml - Fatal编程技术网

C# 如何在文本框输入更改时获取要刷新的行大小

C# 如何在文本框输入更改时获取要刷新的行大小,c#,wpf,xaml,C#,Wpf,Xaml,我有一条在画布上绘制的线,它基于用户输入的线的长度。这条线看起来很好,但是当我在文本框中更改数字时,一条新的线只是画在第一行的顶部,而没有去掉第一行 我尝试在不同的地方调用该方法,但没有成功。我是初学者,所以这是全新的。我没有在这个项目中使用MVVM 以下是用户输入号码的位置: <TextBox PreviewTextInput="NumberValidationTextBox" Text="{Binding ycoord}" Name="y" TextChanged="Y_TextCha

我有一条在画布上绘制的线,它基于用户输入的线的长度。这条线看起来很好,但是当我在文本框中更改数字时,一条新的线只是画在第一行的顶部,而没有去掉第一行

我尝试在不同的地方调用该方法,但没有成功。我是初学者,所以这是全新的。我没有在这个项目中使用MVVM

以下是用户输入号码的位置:

<TextBox PreviewTextInput="NumberValidationTextBox" Text="{Binding ycoord}" Name="y" TextChanged="Y_TextChanged" Height="20" Width="40" Grid.Row="2" Grid.Column="2"/>
Height是另一种方法,它使用相同的文本框创建矩形,但它会根据纵横比调整大小,因此我需要使用rect.Height来绘制线条,以保持与矩形相同的高度


预期结果是,一旦文本框被更改,该行将自动刷新为新大小。确实会发生这种情况,但旧的行仍保留在新行下方的画布上。

您可以尝试在画布中查找该行,如果不存在,则添加该行,否则更新该行:

public void heightline()
{
    List<UIElement> uIElements = mycanvas.Children.Cast<UIElement>().ToList();

    UIElement heightline = uIElements.Where(p => p.Uid == "myLine").FirstOrDefault();

    if (heightline == null)
    {
        heightline = new Line();
        heightline.Uid = "myLine";
    }


        heightline.Stroke = new SolidColorBrush(Colors.SteelBlue);
        heightline.StrokeThickness = 2;

        heightline.X1 = 510;
        heightline.Y1 = 110;
        heightline.X2 = 510;
        heightline.Y2 = 110 + rect.Height;

    if(uIElements.Count == 0)
    {
        mycanvas.Children.Add(heightline);
    }
}
public void heightline()
{
List uIElements=mycanvas.Children.Cast().ToList();
UIElement heightline=uIElements.Where(p=>p.Uid==“myLine”).FirstOrDefault();
如果(高度线==null)
{
高度线=新线();
heightline.Uid=“myLine”;
}
heightline.Stroke=新的SolidColorBrush(颜色:钢蓝色);
heightline.StrokeThickness=2;
高度线X1=510;
高度线Y1=110;
高度线X2=510;
heightline.Y2=110+垂直高度;
如果(uIElements.Count==0)
{
mycanvas.Children.Add(heightline);
}
}

正确的方法是在XAML中创建行,并将X1/Y1等公开为INPC viewmodel属性,然后绑定这些属性。这样做更简单、更容易。现在发生的事情是这样的:这条线是你添加的一个子线。你永远不会删除它们,你只是添加它们。如果您不想像我上面建议的那样在XAML中使用绑定,请尝试删除旧的绑定。
main
是对viewmodel中的窗口或UI控件的引用吗?main是显示该行的画布的名称,是控件。您是否能够确定此代码是否在viewmodel中?我没有使用视图模型编写此代码..我知道我应该这样做。事后诸葛亮……如果您不想修复代码,只需在名为
\u heightline
的私有字段中保留对
heightline
的引用即可。如果该字段为空,请按现在的方式创建它。如果不为空,只需更新现有坐标即可。
public void heightline()
{
    List<UIElement> uIElements = mycanvas.Children.Cast<UIElement>().ToList();

    UIElement heightline = uIElements.Where(p => p.Uid == "myLine").FirstOrDefault();

    if (heightline == null)
    {
        heightline = new Line();
        heightline.Uid = "myLine";
    }


        heightline.Stroke = new SolidColorBrush(Colors.SteelBlue);
        heightline.StrokeThickness = 2;

        heightline.X1 = 510;
        heightline.Y1 = 110;
        heightline.X2 = 510;
        heightline.Y2 = 110 + rect.Height;

    if(uIElements.Count == 0)
    {
        mycanvas.Children.Add(heightline);
    }
}