【问题标题】:Editing content of textbox from a class从类中编辑文本框的内容
【发布时间】:2020-11-04 08:03:06
【问题描述】:

我是使用 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";
}

目标是更新其他类的文本。

我试图寻找答案,但没有一个能以清晰的方式分解问题。 有人说我必须创建一个主窗口的新实例..?

再次。抱歉,如果解决方案很明显,我似乎无法理解,我一周前开始使用 C# 和 wpf :)

提前致谢,祝你好运!

【问题讨论】:

  • 您是否尝试过将此ClientConsoleTextBox.Text = ClientConsoleText; 添加到您的TestButton_Click 方法的末尾?
  • 当我在同一堂课上时它会起作用。但不是当我尝试从另一个类更改文本框时,这就是我想要做的。
  • 要从另一个类更改文本框内容,您可以尝试在当前类上创建一个公共方法并从另一个类调用它。
  • 这将要求我也将其设为静态,因此无法使用文本框内的文本...我刚刚尝试过。

标签: c# wpf .net-framework-4.8


【解决方案1】:

你应该使用 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";
    }
}

【讨论】:

  • 您好!感谢您提供我的帖子!与我使用的计时器实现相比,这是否占用更少的资源和更好的设计选择?
【解决方案2】:

您描述的功能是数据绑定,您必须有一个类,将 ClientConsoleText 作为属性,然后设置一个指向该类的数据源。

一种更简单的方法,但我不知道它是否能满足您的目标,是在表单级别设置一个名为 ClientConsoleText 的属性,用于读取和写入文本框。

示例代码:

 public string ClientConsoleText
    {
        get { return ClientConsoleTextBox.Text; }
        set { ClientConsoleTextBox.Text = value; }
    }

现在,如果您指定 ClientConsoleText = "hello",那么 "hello" 将出现在文本框中。 也可以通过引用ClientConsoleText来获取文本框的值,示例:

string s = ClientConsoleText;

希望这会有所帮助。如果不是,也许你可以解释一下目标是什么。

【讨论】:

  • 字符串必须是静态的...我基本上是在寻找一种方法,使文本框中的数据成为静态的,以便与其他表单和类一起使用。我非常感谢您花时间帮助我,但如果我可以将字符串设置为:public string ClientConsoleText { get { return ClientConsoleTextBox.Text; } set { ClientConsoleTextBox.Text = value; } }
  • 如果我理解正确,所有表单都会在文本框中显示相同的值,然后对使用此文本框的任何表单进行的文本更改都会刷新。所以他们都会显示相同的文本。这就是你想要做的吗?
【解决方案3】:

我最终像这样创建了一个计时器:

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

本质上,它自己更新文本框! 也许这是一个糟糕的设计选择,但它对我有用,希望这对未来的人有所帮助:) 晚安。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2018-04-18
    • 1970-01-01
    相关资源
    最近更新 更多