Получить данные из другого окна

Информация о проекте

  • Проект Фонда презентаций Windows
  • C# как язык программирования

Описание

Можно ли получить данные от пользовательского ввода в Window1 и показать этот ввод в MainWindow?

Я открою пользовательский ввод в виде файла из Window1 и покажу его содержимое в RichTextBox MainWindow.

Окно1

<Window x:Name = "window1" x:Class = "Writer.Window1"
        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:Writer"
        mc:Ignorable = "d"
        Title = "New" Height = "130" Width = "600" WindowStyle = "None" WindowStartupLocation = "CenterScreen" ResizeMode = "CanMinimize">
    <Grid Margin = "0,0,0,-2">
        <Rectangle HorizontalAlignment = "Center" Height = "30" Stroke = "Black" VerticalAlignment = "Top" Width = "600" Fill = "Black"/>
        <Label Content = "Open" HorizontalAlignment = "Left" Margin = "0,2,0,0" VerticalAlignment = "Top" Foreground = "White"/>
        <Button Content = "X" Margin = "579,5,10,0" VerticalAlignment = "Top" Background = "Black" Foreground = "White" BorderBrush = "Black" ToolTip = "Exit" Focusable = "False" IsTabStop = "False" Click = "Button_Click"/>
        <Label Content = "Select the path" HorizontalAlignment = "Left" Margin = "0,35,0,0" VerticalAlignment = "Top"/>
        <TextBox HorizontalAlignment = "Left" Margin = "5,61,0,0" TextWrapping = "Wrap" VerticalAlignment = "Top" Width = "120" IsTabStop = "False"/>
        <Button Content = "Select" HorizontalAlignment = "Left" Margin = "5,84,0,0" VerticalAlignment = "Top" BorderBrush = "White" Background = "#FFADADAD" Width = "45"/>
    </Grid>
</Window>

Главное окно

<Window x:Name = "MainWindow1" x:Class = "Writer.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:Writer"
        mc:Ignorable = "d"
        Title = "Writer" Height = "450" Width = "800" WindowStyle = "None" WindowStartupLocation = "CenterScreen" ResizeMode = "CanMinimize">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height = "164*"/>
            <RowDefinition Height = "83*"/>
            <RowDefinition Height = "203*"/>
        </Grid.RowDefinitions>
        <Rectangle HorizontalAlignment = "Center" Height = "30" Stroke = "Black" VerticalAlignment = "Top" Width = "800" Fill = "Black"/>
        <Label Content = "Writer" HorizontalAlignment = "Left" Margin = "0,2,0,0" VerticalAlignment = "Top" Foreground = "White"/>
        <Button Content = "_" HorizontalAlignment = "Left" Margin = "765,5,0,0" VerticalAlignment = "Top" Background = "Black" Foreground = "White" BorderBrush = "Black" Focusable = "False" ToolTip = "Minimize" IsTabStop = "False" ClickMode = "Press" Click = "Button_Click_1"/>
        <Button Content = "X" Margin = "779,5,10,0" VerticalAlignment = "Top" Background = "Black" Foreground = "White" BorderBrush = "Black" ToolTip = "Exit" Focusable = "False" IsTabStop = "False" Click = "Button_Click"/>
 
        <Menu Margin = "0,30,0,114" Height = "20">
            <MenuItem Header = "File">
                <MenuItem Header = "New">
                    <MenuItem.Icon>
                        <Image Source = "/file-added.svg"/>
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header = "Open" Click = "MenuItem_Click"/>
                <MenuItem Header = "Open from server"/>
                <MenuItem Header = "Save"/>
                <MenuItem Header = "Save as"/>
                <MenuItem Header = "Close file"/>
                <MenuItem Header = "Close folder"/>
            </MenuItem>
            <MenuItem Header = "Start">
                <MenuItem Header = "Font">
                    <MenuItem Header = "Font"/>
                    <MenuItem Header = "Family"/>
                    <MenuItem Header = "Size"/>
                </MenuItem>
                <Separator/>
                <MenuItem Header = "Bold"/>
                <MenuItem Header = "Italic"/>
                <MenuItem Header = "Underline"/>
                <MenuItem Header = "Strikethrough"/>
            </MenuItem>
            <MenuItem Header = "Insert">
                <MenuItem Header = "New site"/>
            </MenuItem>
            <MenuItem Header = "Layout">
                
            </MenuItem>
            <MenuItem Header = "View">
                
            </MenuItem>
            <MenuItem Header = "Help"/>
        </Menu>
        <RichTextBox x:Name = "RichTextBox1" Margin = "0,50,0,0" BorderBrush = "White" Cursor = "Arrow" IsTabStop = "False" Grid.RowSpan = "3" FontFamily = "Segoe UI" BorderThickness = "0,0,0,0">
            <FlowDocument>
                <Paragraph>
                    <Run Text = ""/>
                </Paragraph>
            </FlowDocument>
        </RichTextBox>
    </Grid>
</Window>

С# или VB.NET? Маловероятно, что вы программируете один и тот же класс на обоих языках.

Thomas Weller 02.11.2022 18:39

Моя программа на C# 😺.

github host2 02.11.2022 18:57

В основном ответ, вероятно, бесполезен для вас. Это потому, что вопрос настолько общий и дает так мало деталей, что ответ также может быть только общим и не давать подробностей. Если вам нужен лучший ответ, пожалуйста, отредактируйте вопрос и предоставьте минимально воспроизводимый пример, то есть то, что мы можем скопировать/вставить и скомпилировать.

Thomas Weller 02.11.2022 19:01

Я отредактировал ответ, чтобы включить полный пример

Thomas Weller 02.11.2022 19:14

Хорошо. Я покажу вам немного кода моего проекта 👍.

github host2 02.11.2022 19:19

Лицензия кода на Stack Overflow всегда CC-BY-SA. Я не думаю, что вы можете это изменить. И вопрос: а что, если вы интегрируете код из моего ответа в свой проект? Это законно? Вероятно, вам следует упомянуть, откуда этот код (но мне все равно. Я дам его вам бесплатно, как CC-0).

Thomas Weller 02.11.2022 19:31

Кроме того, не искажайте свой вопрос, особенно после того, как на него был дан ответ.

Hovercraft Full Of Eels 03.11.2022 11:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, есть способ.

Реализуйте общедоступный метод в Window1, который предоставит вам данные. Затем используйте ссылку на Window1 и вызовите этот метод. Если MainWindow не имеет ссылки на Window1, дайте ссылку.

Вот пример. Предполагается, что вы открываете второе окно из основного окна.

In addition to the CC-BY-SA license of Stack Overflow, I license this as CC-0 for anyone who needs this code in one of his projects.

MainWindow.xaml

<Window x:Class = "GetDataFromOtherWindow.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"
        mc:Ignorable = "d"
        Title = "MainWindow" Height = "450" Width = "800">
    <StackPanel>
        <Button Content = "Open other window" Click = "Button_Click" />
        <Button Content = "Get data from other window" Click = "Button_Click_1" />
    </StackPanel>
</Window>

MainWindow.xaml.cs

using System.Windows;

namespace GetDataFromOtherWindow
{
    public partial class MainWindow : Window
    {
        private Window1? otherWindow;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            otherWindow = new Window1();
            otherWindow.Show();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            if (otherWindow != null)
            {
                MessageBox.Show(otherWindow.GetData());
            }
        }
    }
}

Window1.xaml

<Window x:Class = "GetDataFromOtherWindow.Window1"
        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"
        mc:Ignorable = "d"
        Title = "Window1" Height = "141" Width = "400">
    <StackPanel>
        <RichTextBox Name = "richBox">
            <FlowDocument>
                <Paragraph>
                    <Run Text = "This is some text"/>
                </Paragraph>
            </FlowDocument>
        </RichTextBox>
    </StackPanel>
</Window>

Окно1.xaml.cs

using System.Windows;
using System.Windows.Documents;

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

        public string GetData()
        {
            TextRange textRange = new TextRange(
                richBox.Document.ContentStart,
                richBox.Document.ContentEnd
            );
            return textRange.Text;
        }
    }
}

Обратите внимание, что это не очень удобно для MVVM, потому что в этом коде нет модели, которая знала бы о бизнес-логике.

Согласно комментариям, если вы хотите показать данные после закрытия Window1, вы можете сделать это:

MainWindow.xaml.cs

using System.Windows;

namespace GetDataFromOtherWindow
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var otherWindow = new Window1();
            otherWindow.ShowDialog();
            MessageBox.Show(otherWindow.GetData());
        }
    }
}

Код для получения данных непосредственно перед закрытием окна:

using System.Windows;

namespace GetDataFromOtherWindow
{
    public partial class MainWindow : Window
    {
        private Window1? otherWindow;

        public MainWindow()
        {
            InitializeComponent();
        }

        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            if (otherWindow != null)
            {
                MessageBox.Show(otherWindow.GetData());
            }

            base.OnClosing(e);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            otherWindow = new Window1();
            otherWindow.Show();
        }
    }
}

Могу ли я показать текст сразу после закрытия Window1? Или Window1 должен быть открыт, чтобы показать текст?

github host2 02.11.2022 19:21

Вы также можете показать его после закрытия формы. я обновил ответ

Thomas Weller 02.11.2022 19:30

Но этот код описывает, как открыть Window1 и показать его как диалоговое окно. Но могу ли я сделать код, который Window1 отправляет ввод, когда он находится рядом с MainWindow?

github host2 02.11.2022 19:34

Кто будет обрабатывать данные при закрытии MainWindow? Куда вы хотите отправить данные? Ну, он может обрабатывать данные прямо перед тем, как они исчезнут, если вам это нравится.

Thomas Weller 02.11.2022 19:35

Можете ли вы показать мне пример, как отправлять данные из Window1 перед закрытием в MainWindow?

github host2 02.11.2022 19:40

@githubhost2: да. Сделанный

Thomas Weller 02.11.2022 19:48

Я не могу бежать GetValue за TextBox.

github host2 04.11.2022 13:47

@githubhost2: в моем коде нет GetValue(). Вы, должно быть, реализовали это сами.

Thomas Weller 04.11.2022 16:23

Другие вопросы по теме