Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
15 / 1 / 1
Регистрация: 28.09.2016
Сообщений: 13
WPF

Вызов метода в UserControl из другого окна Window

01.09.2021, 08:47. Показов 3897. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Изучаю связку С# + WPF. И сейчас столкнулся с вот какой проблемой.
Есть Главное окно MainWindow c contentcontrol.
C#
1
2
3
4
5
6
7
8
9
10
11
12
using System.Windows;
namespace windowsTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            myContentControl.Content = new UserControl1();
        }
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
<Window x:Class="windowsTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <ContentControl x:Name="myContentControl" Content="ContentControl" HorizontalAlignment="Left" Margin="20,29,0,0" VerticalAlignment="Top" Height="296" Width="625"/>
    </Grid>
</Window>
Сам UserControl1 с кнопкой и текстовым полем
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System.Windows;
using System.Windows.Controls;
 
namespace windowsTest
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Window1 window1 = new Window1();
            window1.Show();
        }
        public void myMessage()
        {
            Tbox.Text = "Кнопка нажата";
        }
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
<UserControl x:Class="windowsTest.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d" Height="360" Width="670">
    <Grid Margin="0,0,250,190">
        <TextBox x:Name="Tbox" HorizontalAlignment="Left" Height="40" Margin="25,20,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="190"/>
        <Button Content="Button" HorizontalAlignment="Left" Margin="230,20,0,0" VerticalAlignment="Top" Width="170" Height="40" Click="Button_Click"/>
    </Grid>
</UserControl>
по нажатию кнопки из UserControl1 открывается сплывающее окно Window1
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.Windows;
namespace windowsTest
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // Вызвать метод myMessage() в UserControl1
        }
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
<Window x:Class="windowsTest.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="Window1" Height="161" Width="353.333">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Margin="40,25,0,0" VerticalAlignment="Top" Width="250" Height="55" Click="Button_Click"/>
    </Grid>
</Window>
Вопрос: Можно ли по нажатию кнопки в окне Window1 выполнить метод myMessage() в UserControl1, чтоб в Tbox UserControl1 отобразилась надпись?

Добавлено через 26 минут
Нашел вот такое решение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System.Windows;
namespace windowsTest
{ 
    public partial class Window1 : Window
    {   
        public Window1()
        {
            InitializeComponent();    
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // Вызвать метод в myMessage() в UserControl1
            MainWindow MainWindow = (Application.Current as App).MainWindow as MainWindow;
            UserControl1 userControl1 = new UserControl1();
            MainWindow.myContentControl.Content = userControl1;
            userControl1.myMessage();
        }
    }
}
Но насколько оно корректно? Или есть решение проще и правильнее?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.09.2021, 08:47
Ответы с готовыми решениями:

Вызов Window.ShowDialog() срабатывает как Window.Show(), т.е. я могу нажимать на другие окна
Здравствуйте, уважаемые форумчане. Столкнулся с проблемой. У меня есть окно, которое выполняет некоторые действия всё время работы...

Вызов метода у UserControl из ViewModel
Есть библиотека пользовательских элементов управления. В ней EventLogControl и AnimationControl. В XAML для EventLogControl задаётся...

Вызов метода основной формы из UserControl
Привет! Перехожу от VB VS6 к VS10 WF C# и пока ломаю мозги для работы по новому. Суть проблемы в том что есть основная форма на которой...

2
 Аватар для Midian
606 / 388 / 198
Регистрация: 31.03.2013
Сообщений: 2,690
01.09.2021, 09:56
По хорошему у вас в главном окне должна быть ссылка на ваш UserControl в XAML разметке, там же вы можете связать ваши DataСontext-ы и вызывать вам нужные команды и т.д., т.е. у вас получится так, что в главной ViewModel будет ссылка на DataContext UserControl
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,112
Записей в блоге: 2
01.09.2021, 11:46
Лучший ответ Сообщение было отмечено seartur как решение

Решение

Цитата Сообщение от seartur Посмотреть сообщение
Нашел вот такое решение
Дичь ужасная!

Цитата Сообщение от seartur Посмотреть сообщение
Или есть решение проще и правильнее?
Без MVVM - все решения будут костылями.
Оценивать какой костыль более кривой не имеет смысла.

Пара вариантов не настолько диких как вы нашли.

Создаёте интерфейс для метода:
C#
1
2
3
4
public inteface ISendMessage
{
    void SendMessage(string message = "Кнопка нажата");
}
Задаёте его в своём контроле:
C#
1
2
3
4
5
6
7
    public partial class UserControl1 : UserControl, ISendMessage
    {
 
        public void SendMessage(string message)
        {
            Tbox.Text =message ;
        }
Теперь вы можете передать свой контрол по этому интерфейсу.
Для того чтобы Окно приняло его, можно задать свойство в Окне или дополнить конструктор.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public partial class Window1 : Window
    {
        private readonly ISendMessage messendger;
        public Window1(ISendMessage messendger)
        {
            this.messendger = messendger;
            InitializeComponent();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // Вызвать метод myMessage() в UserControl1
            messendger.SendMessage();
        }
    }
И осталось передать интерфейс при создании Окна:
C#
1
2
3
4
5
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Window1 window1 = new Window1(this);
            window1.Show();
        }
В интерфейсе может несколько методов, свойств.

Другой способ, это передача делегата, но он может вызывать только один метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public partial class Window1 : Window
    {
        private readonly Action messageHanler;
        public Window1(Action messageHanler)
        {
            this.messageHanler = messageHanler;
            InitializeComponent();
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // Вызвать метод myMessage() в UserControl1
            messageHanler();
        }
    }
C#
1
2
3
4
5
6
7
8
9
        public void SendMessage()
        {
            Tbox.Text = "Кнопка нажата";
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Window1 window1 = new Window1(SendMessage);
            window1.Show();
        }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.09.2021, 11:46
Помогаю со студенческими работами здесь

Вызов методов классов друг у друга (вызов метода из другого класса)
Есть несколько классов, которые могут вызывать методы (функции) друг у друга. Логика: класс1 имеет метод А, класс2 имеет метод Б, класс1...

Взаимодействие UserControl с Window, в которое он помещен. Какие существуют варианты оповещения окна о событиях в элементе
до сих пор делсю так: в UserControl ApplicationCommands.Help.Execute(true, null); MyWindow.xaml.cs:

Вызов метода, ожидающего завершение другого метода
Имеется процедура Proc. Я её вызываю в Button. Только вот программа, не дожидаясь завершения процедуры переходит к следующей строчке кода....

Вызов переменной метода из другого метода
class A(): def m(self): number = x #переменный параметр - номер заявки, определяется во время выполнения метода ...

Вызов метода из метода другого класса
Хочу оптимизировать код, подскажите,как это лучше сделать. У меня есть два класса, в Классе1 есть Метод1, в котором меняются значения полей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru