Почему метод Undo WPF TextBox не работает, если значение инициализировано в конструкторе? - PullRequest
1 голос
/ 30 января 2012

Я написал простое приложение WPF, в котором я хотел проверить метод Отменить , предоставляемый WPF TextBox.По сути, при нажатии кнопки «Отменить» значение TextBox должно быть возвращено.

Это мой код xaml

<Window x:Class="WpfApplication2.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
  <StackPanel>
    <TextBox Name="textBox1"  />
    <Button Name="button1" Click="button1_Click">Undo</Button>
    <Button Name="button2" Click="button2_Click">Change value to 100</Button>
  </StackPanel>
</Window>

В моем файле xaml.cs я написал следующее:

Случай 1: где работает Undo :: Я нажимаю на кнопку «Изменить значение на 100» в окне, текст TextBox становится равным 100. Теперь я нажимаю кнопку «Отменить», значение TextBox становится пустым.

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        textBox1.Undo();
    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {
        textBox1.Text = "100";
    }
}

Случай 2: Отмена не работает :: Я устанавливаю значение текста TextBox на 100 в конструкторе, текст TextBox становится равным 100. Теперь я нажимаю на кнопку Отменить значениеTextBox не становится пустым !!

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        textBox1.Text = "100";
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        textBox1.Undo();
    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {

    }
}

Почему функция отмены не работает во втором случае?Это потому, что TextBox все еще не создан?Но я проверил все свойства TextBox, такие как Loaded, Initialized и т. Д., Которые были установлены в «True»

1 Ответ

1 голос
/ 30 января 2012

Я не уверен в технической причине, но многие элементы управления в WPF не будут полностью функциональными, пока после конструктора. Но вы все равно можете обойти это, подключив событие Loaded.

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        //textBox1.Text = "100";
        textBox1.Loaded += new RoutedEventHandler(textBox1_Loaded);
    }

    void textBox1_Loaded(object sender, RoutedEventArgs e)
    {
        textBox1.Text = "100";
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        textBox1.Undo();
    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {
    }
}

Кнопка отмены должна работать должным образом.

...