在用户选择的位置将文本框添加到WPF画布(C#) [英] Add a textbox to a wpf canvas in a position chosen by the user (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屋!