在用户选择的位置将文本框添加到WPF画布(C#) [英] Add a textbox to a wpf canvas in a position chosen by the user (C#)

查看:127
本文介绍了在用户选择的位置将文本框添加到WPF画布(C#)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想向WPF C#应用程序添加一项功能,允许用户执行以下操作:



当您按下按钮时,将在其中创建一个文本框。



I在画布的一角,当您完成输入后再次按下按钮时,下次单击将设置此文本框在画布上的新位置。



I尝试编写代码,但看起来不太牢固,再加上以下错误说明:

  int i = 0; 

System.Windows.Point currentPoint = new System.Windows.Point();

private void button1_Click(对象发送者,RoutedEventArgs e,System.Windows.Input.MouseEventArgs e2)
{
i = i + 1;
if(i == 1)
{
TextBlock TB = new TextBlock();
TB.Text =成功满;
TB.Background = Brushes.White;
TB.Name = TextB;
myCanvas.Children.Add(TB);

Canvas.SetLeft(TB,10);
Canvas.SetTop(TB,10);
}

如果(i == 2)
{
Thread.Sleep(500);
而(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;
}

}

但是我声明了文本框(TB )放在 if语句中,因此当我尝试修改其位置时,它被视为未知 Canvas.SetLeft(TB,currentPoint.X);
。如果我在外面声明它,即使不按该按钮也将创建文本框。有任何想法吗?



另外,如果您还有其他看起来不太丑的解决方案,请随时分享!

解决方案

一种潜在的解决方案(但是老实说,这是一个快速而肮脏的解决方案),解决方案可以是以下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();
}

私人布尔isTextEditing;

私人无效OnButtonClick(对象发送者,RoutedEventArgs e)
{
if(!isTextEditing)
{
TextBox.Visibility = Visibility.Visible;
isTextEditing = true;
}
else
{
isTextEditing = false;
}
}

私人无效OnPreviewMouseUp(对象发送者,MouseButtonEventArgs e)
{
//只要TextBox.Visibility崩溃且用户在
// //首次点击后处于'textEditing'中,如果(!isTextEditing&& TextBox.Visibility == Visibility.Visible)
,则不要处理画布
中的点击{
Point clickPoint = e.GetPosition(PositioningCanvas);
Canvas.SetTop(TextBox,clickPoint.Y);
Canvas.SetLeft(TextBox,clickPoint.X);
}
}


I would like to add a functionality to a WPF C# app that allows the user to do the following:

When you press a button, a textbox is created in the corner of a canvas, when you're done typing and you press the button again, the next click will set the new position of this textbox on the canvas.

I tried writing the code but it doesn't look very solid, plus I get an error explained below:

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;
    }

}

However I declared my textbox (TB) inside of an "if" statement, so when I try to modify its position, it is considered unknown Canvas.SetLeft(TB, currentPoint.X); . If I declare it outside, the textbox will be created even if the button isn't pressed. Any ideas?

Also if you have another solution that looks less ugly, feel free to share!

解决方案

A potential (but to be honest with you a quick & dirty one), solution could be the following 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>

With the MainWindow.cs like this:

    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);
        }
    }

这篇关于在用户选择的位置将文本框添加到WPF画布(C#)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆