none
Не набирается текст в TextBox (WPF) RRS feed

  • Вопрос

  • Всем привет.

    У меня возникла следующая проблема. Разрабатываю приложение. Отдельно пишется ядро, в котором реализовывается весь функционал приложения. Отдельно разрабатывается форма на WPF. 

    Дак вот. Когда я начал писать загрузчик всего приложения, который загружает ядро, форму и связывает их через интерфейсы, то получил такой непонятный фокус:
    когда я пытаюсь набрать на форме в TextBox'е текст, то ничего не набирается. ВООБЩЕ НИЧЕГО НЕ НАБИРАЕТСЯ. Срабатывает только пробел и бэкспейс. Если же попробовать вставить в этот TextBox текст скопированный в буфер обмена, то все нормально вставляется. Однако если эту же форму запустить как самостоятельное приложение, то все набирается как и должно, то есть форма полностью рабочая.

    Что это за странное поведение WPF-формы а именно TextBox'а и как с этим бороться?
    • Перемещено Tagore Bandlamudi 1 октября 2010 г. 21:49 MSDN Forums consolidation (От:Visual C#)
    5 марта 2010 г. 23:36

Ответы

  • Загрузчик был реализован в файле App.xaml.cs в котором находится class App, который инициализируется сразу при запуске приложения. А в файле App.xaml была удалена форма, которая обычно запускается сразу при запуске приложения. Таким образом в классе App можно реализовать всю логику загрузки приложения. И при этом текст в TextBox набирается корректно.
    20 июня 2010 г. 10:10

Все ответы

  • Я думаю без просмотра кода тут не обойтись. Можете показать какой-нибудь пример?


    [Мой блог], [LinkedIn]
    6 марта 2010 г. 7:15
  • Вот собственно загрузчик, при написании которого выявилось странное поведение формы:

    using System;
    using System.Windows.Forms;
    using Core;
    using Core.ProgramObject;
    using Core.CompilerConveyorController;
    using Forms;
    
    namespace Education_Studio
    {
        class Program
        {
            /// <summary>
            /// Точка входа в приложение.
            /// </summary>
            /// <param name="args">Аргументы, переданные при запуске приложения.</param>
            [STAThread] // Запросить, чтобы главный поток приложения вошел в однопоточный апартамент
            static void Main(string[] args)
            {
                try
                {
                    // Включение всех визуальных стилей для приложения
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
    
                    // Запуск приложения как такогого
                    MainApplication application = new MainApplication();
                    application.Run();
    
                    Application.Run();
                }
                catch (Exception e)
                {
                    MessageBox.Show("Приложение или объект, вызвавший ошибку: " + e.Source + "\n\n" +
                                    "Метод, вызвавший исключение: " + e.TargetSite + "\n\n" +
                                    "Сообщение исключения: " + e.Message,
                                    "Ошибка");
                }
            }
    
            /// <summary>
            /// Главный класс приложения.
            /// </summary>
            private class MainApplication
            {
                /// <summary>
                /// Указатель на ядро компилятора.
                /// </summary>
                private Core.Core Core { get; set; }
    
                /// <summary>
                /// Указатель на интерфейс программы.
                /// </summary>
                private IProgramObject Program { get; set; }
    
                /// <summary>
                /// Указатель на интерфейс конроллера.
                /// </summary>
                private ICompilerConveyorController Controller { get; set; }
    
                /// <summary>
                /// Указатель на загрузочную форму.
                /// </summary>
                private LoadWindow LoadWindow { get; set; }
    
                /// <summary>
                /// Указатель на главную форму.
                /// </summary>
                private MainWindow MainWindow { get; set; }
    
                /// <summary>
                /// Запуск приложения.
                /// </summary>
                public void Run()
                {
                    try
                    {
                        // Загрузка загрузочной формы
                        LoadWindow = new LoadWindow();
                        LoadWindow.Show();
    
                        // Загрузка ядра
                        this.Core = new Core.Core();
                        this.Program = this.Core.GetProgramObject();
                        this.Controller = this.Core.GetCompilerConveyorController();
    
                        // Загрузка основной формы
                        MainWindow = new MainWindow();
                        MainWindow.Closed += ClosedMainForm;
    
                        // Связываение формы и ядра
    
                        // Уборка загрузочной формы
                        LoadWindow.Close();
    
                        // Финальное отображение программы
                        MainWindow.Show();
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show("Приложение или объект, вызвавший ошибку: " + e.Source + "\n\n" +
                                        "Метод, вызвавший исключение: " + e.TargetSite + "\n\n" +
                                        "Сообщение исключения: " + e.Message,
                                        "Ошибка");
                    }
                }
    
                /// <summary>
                /// Действия при закрытии приложения.
                /// </summary>
                private void ClosedMainForm(object sender, EventArgs e)
                {
                    Application.Exit();
                }
            }
        }
    }
    

    6 марта 2010 г. 8:06
  • Мне кто-нибудь может помочь или хотя бы посоветовать в каком направлении копать?
    7 марта 2010 г. 22:43
  • В приведенном вами коде проблемы не видно. У вас имеются какие-нибудь обработчики или перегрузки нажатий клавиш?? Может быть где-то имеется что-то подобное e.Handled = true ??
    10 марта 2010 г. 14:22
  • Нет. Ядро соединяется с формой только для получения различных данных и передачи данных в ответ на запрос форме. И работает она полностью самостоятельно. Никакие события не перехватываются.

    Покопавшись хорошенько  в документации сложилось впечатление, что обычное приложение и приложение WPF устроены внутри по-разному, а именно, по разному устроены потоки в которых обрабатываются эти приложения, из-за чего собственно и получается такое поведение формы.

    И поэтому у меня появился следующий вопрос, как подружить обычное приложение и приложение WPF, сведя их в одно приложение?

    То есть например форму я делаю в WPF проекте. Далее создаю консольный проект. Подключаю в нем WPF-проект. И запускаю WPF-форму в консольном приложении.

    Надеюсь идея того, что я пытаюсь добиться понятна.
    11 марта 2010 г. 14:17
  • В WinForms можно хостить WPF элементы..
    Для связи [Mail]
    12 марта 2010 г. 8:26
  • В том то и дело, что мне хотелось бы запустить самую обычную WPF-форму в нормальном для нее режиме, не используя обходные пути. Заодно разобраться с тем, в чем же все-таки дело. Да и к тому же WinForms я не использую в данном проекте. Хотелось бы обойтись без него.
    12 марта 2010 г. 19:45
  • Есть у кого нибудь еще какие-нибудь рассуждения на данную тему? Или все-таки предложенный способ построения приложения не реализовать?
    14 марта 2010 г. 10:32
  • Загрузчик был реализован в файле App.xaml.cs в котором находится class App, который инициализируется сразу при запуске приложения. А в файле App.xaml была удалена форма, которая обычно запускается сразу при запуске приложения. Таким образом в классе App можно реализовать всю логику загрузки приложения. И при этом текст в TextBox набирается корректно.
    20 июня 2010 г. 10:10
  • 

    Возникла точно такая же проблема. Решил путем использования "LoadWindow.ShowDialog();" вместо "LoadWindow.Show();". 

    9 сентября 2013 г. 16:06