在wpf画布上添加一个文本框,位置由用户选择(c#)

本文关键字:位置 用户 选择 文本 一个 添加 wpf | 更新日期: 2023-09-27 18:03:57

我想在WPF c#应用程序中添加一个功能,允许用户执行以下操作:

当你按下一个按钮时,一个文本框将在画布的角落创建,当你完成输入并再次按下按钮时,下一次点击将设置该文本框在画布上的新位置。

我试着写代码,但它看起来不太可靠,加上我得到一个错误解释如下:

int i = 0;
System.Windows.Point currentPoint = new System.Windows.Point();
private void button1_Click(object sender, RoutedEventArgs e, System.Windows.Input.MouseEventArgs e2)
{
    i = i + 1;
    if (i == 1)
    {
        TextBlock TB = new TextBlock();
        TB.Text = "Successfull";
        TB.Background = Brushes.White;
        TB.Name = "TextB";
        myCanvas.Children.Add(TB);
        Canvas.SetLeft(TB, 10);
        Canvas.SetTop(TB, 10);
    }
    if (i == 2)
    {
        Thread.Sleep(500);
        while (e2.LeftButton != MouseButtonState.Pressed)
        {
             Thread.Sleep(50);
        }
        if (e2.LeftButton == MouseButtonState.Pressed)
        {
            currentPoint = e2.GetPosition(this);
            Canvas.SetLeft(TB, currentPoint.X);
            Canvas.SetTop(TB, currentPoint.Y);
        }
        i=0;
    }
}

然而,我在"if"语句中声明了我的文本框(TB),所以当我试图修改它的位置时,它被认为是未知的Canvas.SetLeft(TB, currentPoint.X);. 如果我在外部声明它,即使没有按下按钮,也会创建文本框。什么好主意吗?

如果你有其他看起来不那么难看的解决方案,请随时分享!

在wpf画布上添加一个文本框,位置由用户选择(c#)

一个潜在的(但说实话,快速的),解决方案可以是下面的MainWindow.xaml:

<Window x:Class="CanvasTextBox.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">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Button Grid.Row="0" Click="OnButtonClick" >Click Me</Button>
    <Canvas Grid.Row="1" Background="LightSkyBlue" 
            x:Name="PositioningCanvas"
            PreviewMouseUp="OnPreviewMouseUp">
        <TextBox x:Name="TextBox" Visibility="Collapsed" MinWidth="80" />
    </Canvas>
</Grid>

与MainWindow.cs这样:

    public MainWindow()
    {
        InitializeComponent();
    }
    private bool isTextEditing;
    private void OnButtonClick(object sender, RoutedEventArgs e)
    {
        if (!isTextEditing)
        {
            TextBox.Visibility = Visibility.Visible;
            isTextEditing = true;
        }
        else
        {
            isTextEditing = false;
        }
    }
    private void OnPreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        // As long as your TextBox.Visibility is Collapsed and the user is in 'textEditing' after the
        // first click, don't handle clicks in the Canvas
        if (!isTextEditing && TextBox.Visibility == Visibility.Visible)
        {
            Point clickPoint = e.GetPosition(PositioningCanvas);
            Canvas.SetTop(TextBox, clickPoint.Y);
            Canvas.SetLeft(TextBox, clickPoint.X);
        }
    }