从 class 编辑文本框的内容
Editing content of textbox from a class
我对使用 C# 进行编程还很陌生,我正在尝试更改主窗体中名为“ClientWindow”的文本框的值,该文本框称为 ClientConsoleTextBox。我试过这样做:
public static string ClientConsoleText;
然后当 ClientConsoleTextBox 初始化时,我在事件属性中设置如下:
private void ClientConsoleTextBox_Initialized(object sender, EventArgs e)
{
ClientConsoleTextBox.Text = ClientConsoleText;
}
我可以更改字符串“ClientConsoleText”,但“ClientConsoleTextBox.Text”字符串永远不会更新为我可能添加到字符串 ex.Button 的任何文本:
private void TestButton_Click(object sender, RoutedEventArgs e)
{
ClientConsoleText += "TestString";
}
目标是更新来自其他 类 的文本。
我曾尝试寻找答案,但其中 none 以清晰的方式分解了问题。
有人说我必须创建一个新的主实例 window..?
再次。抱歉,如果解决方案很明显但我似乎无法理解,我一周前开始使用 C# 和 wpf :)
提前致谢,祝您愉快!
您描述的功能是数据绑定,您必须有一个 class,将 ClientConsoleText 作为 属性,然后设置一个指向 class 的数据源。
一种更简单的方法,但我不知道它是否能满足您的目标,即在表单级别设置一个名为 ClientConsoleText 的 属性 来读取和写入文本框。
示例代码:
public string ClientConsoleText
{
get { return ClientConsoleTextBox.Text; }
set { ClientConsoleTextBox.Text = value; }
}
现在,如果您指定 ClientConsoleText = "hello",则文本框中将出现“hello”。
也可以通过引用ClientConsoleText获取textbox的值,Example:
string s = ClientConsoleText;
希望这对您有所帮助。如果不是,也许你可以解释一下目标是什么。
我最终像这样创建了一个计时器:
private void ClientConsoleTextBox_Initialized(object sender, EventArgs e)
{
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(100);
timer.Tick += timer_Tick;
timer.Start();
}
然后每 100 毫秒它将:
void timer_Tick(object sender, EventArgs e)
{
ClientConsoleTextBox.Text = ClientConsoleText;
}
本质上,它自己更新文本框!
也许这是一个糟糕的设计选择,但这对我有用,希望这对以后的人有所帮助:)晚安。
您应该使用 TextBox.Text 属性 来更新 UI,
ClientConsoleText += "TestString";
ClientConsoleTextBox.Text = ClientConsoleText;
或者实现INotifyPropertyChanged接口,使用绑定更新UI
public class SimpleViewModel : INotifyPropertyChanged
{
private string myText;
public string MyText
{
get
{
return myText;
}
set
{
myText = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("MyText")));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
MainWindow.Xaml
<Window x:Class="WpfApp2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp2"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<StackPanel>
<!--Binding to SimpleViewModel.MyText-->
<TextBox Text="{Binding MyText}"/>
<Button Content="Update" Click="Button_Click"/>
</StackPanel>
MainWindow.cs
public partial class MainWindow : Window
{
SimpleViewModel viewmodel = new SimpleViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = viewmodel();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//get textbox value
var text = viewmodel.MyText;
//set textbox value
viewmodel.MyText = "HelloWorld";
}
}
我对使用 C# 进行编程还很陌生,我正在尝试更改主窗体中名为“ClientWindow”的文本框的值,该文本框称为 ClientConsoleTextBox。我试过这样做:
public static string ClientConsoleText;
然后当 ClientConsoleTextBox 初始化时,我在事件属性中设置如下:
private void ClientConsoleTextBox_Initialized(object sender, EventArgs e)
{
ClientConsoleTextBox.Text = ClientConsoleText;
}
我可以更改字符串“ClientConsoleText”,但“ClientConsoleTextBox.Text”字符串永远不会更新为我可能添加到字符串 ex.Button 的任何文本:
private void TestButton_Click(object sender, RoutedEventArgs e)
{
ClientConsoleText += "TestString";
}
目标是更新来自其他 类 的文本。
我曾尝试寻找答案,但其中 none 以清晰的方式分解了问题。 有人说我必须创建一个新的主实例 window..?
再次。抱歉,如果解决方案很明显但我似乎无法理解,我一周前开始使用 C# 和 wpf :)
提前致谢,祝您愉快!
您描述的功能是数据绑定,您必须有一个 class,将 ClientConsoleText 作为 属性,然后设置一个指向 class 的数据源。
一种更简单的方法,但我不知道它是否能满足您的目标,即在表单级别设置一个名为 ClientConsoleText 的 属性 来读取和写入文本框。
示例代码:
public string ClientConsoleText
{
get { return ClientConsoleTextBox.Text; }
set { ClientConsoleTextBox.Text = value; }
}
现在,如果您指定 ClientConsoleText = "hello",则文本框中将出现“hello”。 也可以通过引用ClientConsoleText获取textbox的值,Example:
string s = ClientConsoleText;
希望这对您有所帮助。如果不是,也许你可以解释一下目标是什么。
我最终像这样创建了一个计时器:
private void ClientConsoleTextBox_Initialized(object sender, EventArgs e)
{
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(100);
timer.Tick += timer_Tick;
timer.Start();
}
然后每 100 毫秒它将:
void timer_Tick(object sender, EventArgs e)
{
ClientConsoleTextBox.Text = ClientConsoleText;
}
本质上,它自己更新文本框! 也许这是一个糟糕的设计选择,但这对我有用,希望这对以后的人有所帮助:)晚安。
您应该使用 TextBox.Text 属性 来更新 UI,
ClientConsoleText += "TestString";
ClientConsoleTextBox.Text = ClientConsoleText;
或者实现INotifyPropertyChanged接口,使用绑定更新UI
public class SimpleViewModel : INotifyPropertyChanged
{
private string myText;
public string MyText
{
get
{
return myText;
}
set
{
myText = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("MyText")));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
MainWindow.Xaml
<Window x:Class="WpfApp2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp2"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<StackPanel>
<!--Binding to SimpleViewModel.MyText-->
<TextBox Text="{Binding MyText}"/>
<Button Content="Update" Click="Button_Click"/>
</StackPanel>
MainWindow.cs
public partial class MainWindow : Window
{
SimpleViewModel viewmodel = new SimpleViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = viewmodel();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//get textbox value
var text = viewmodel.MyText;
//set textbox value
viewmodel.MyText = "HelloWorld";
}
}