Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/40: Рейтинг темы: голосов - 40, средняя оценка - 4.78
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358

Получить имя родительского объекта

10.12.2018, 08:50. Показов 8242. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Как получить имя контейнера Grid, в котором расположен элемент Button?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.12.2018, 08:50
Ответы с готовыми решениями:

Получить имя объекта под курсором
Ребята как получить имя контрола на который направлена мышка или нажат пальцем?

Как получить имя объекта находящегося в DataGrid.RowDetailsTemplate
Как получить имя объекта находящегося в DataGrid.RowDetailsTemplate? это описано в xaml <data:dataGrid x:Name="dg1">...

Поиск родительского элемента\объекта
Вообщем, есть нажатие на элемент. Вызывается событие, например: public void ADMuH_KLuK_nO_KATEGOPuu(object sender,...

28
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 2
13.12.2018, 16:23
Студворк — интернет-сервис помощи студентам
asdfg15432, ну Вы и намудрили!!! Это всё делается совсем по другому. Все однотипные элементы вводятся в ListBox, а в нём указывается как их отображать.
Стили тоже надо было вынести в отдельный файл.

Теперь по теме. Что из чего Вам надо получить?
Миниатюры
Получить имя родительского объекта  
0
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
14.12.2018, 08:52  [ТС]
Я подозревал, что я делаю что-то не так)
1) На каждой из трех матриц перевожу некоторое количество ToggleButton(не обязательно одинаковые на всех матрицах) в режим IsChecked=true;
2) Жму на кнопку Save и все ToggleButton, свойство IsChecked которых переведены в True, записываются в файл;
3) Затем, при следующем запуске, жму на кнопку Load и из файла подгружаются все имена ToggleButton(IsChecked=True) и заносятся каждый набор(из предыдущего пункта 2) в свою матрицу.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 2
14.12.2018, 13:05
Лучший ответ Сообщение было отмечено asdfg15432 как решение

Решение

Цитата Сообщение от asdfg15432 Посмотреть сообщение
Я подозревал, что я делаю что-то не так)
1) На каждой из трех матриц перевожу некоторое количество ToggleButton(не обязательно одинаковые на всех матрицах) в режим IsChecked=true;
2) Жму на кнопку Save и все ToggleButton, свойство IsChecked которых переведены в True, записываются в файл;
3) Затем, при следующем запуске, жму на кнопку Load и из файла подгружаются все имена ToggleButton(IsChecked=True) и заносятся каждый набор(из предыдущего пункта 2) в свою матрицу.
У Вас структура Окна жёсткая. Вся работа с элементами проводится в CB. Работаете со всеми элементами по их именам. Имена Grid известны.
Для Вашего подхода, сохранение коллекции состояний кнопок каждого Grid, наверное, лучший вариант.
Только я не понял как это связанно с названием темы "Получить имя родительского объекта"?

Что касается самой реализации, то Вам надо было сначала посоветоваться о способах реализации такого приложения. Переделывать сейчас..... можно. Но сомневаюсь, что Вы будете. По сути всё, что сделано на данный момент, придётся отправить в мусор.
Для примера посмотрите маленький XAML из темы Audio + WPF
Там тоже навернул автор с XAML и мой вариант как надо было делать (пост #6)
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    <Window.Resources>
        <sys:String x:Key="Alphabet">АБВГДЕЖЗИКЛМНОПРСТУФХЧШЩЫЫьЭЮЯ</sys:String>
    </Window.Resources>
    <Grid>
        <ListBox ItemsSource="{StaticResource Alphabet}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Button Margin="1" Content="{Binding}" Width="60" Height="60" Click="GameButton_Click" MouseEnter="GameButton_MouseEnter" />
                </DataTemplate>
            </ListBox.ItemTemplate>
           <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>
    </Grid>
Так же и у Вас. Вам надо было создать нормальную Модель данных и потом просто подключить её к окну. Из-за отсутствия Модели, Вы её неявное реализовали в CB окна явно работая с элементами. Поэтому и куча неспецифических для WPF проблем для которых не существует общего типового решения. Приходится изобретать костыли.
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
14.12.2018, 14:23
Вот я тут набросал небольшой примерчик, мож пригодится:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<Window x:Class="WpfApplication3.ToggleButtonWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        mc:Ignorable="d" 
        Height="250" Width="550"
        Title="ToggleButtonWindow">
 
    <Window.Resources>
        <Style TargetType="ToggleButton" x:Key="TBStyle">
            <Setter Property="Width" Value="50"/>
            <Setter Property="Height" Value="50"/>
            <Setter Property="Content" Value="{Binding TBName}"/>
            <Setter Property="IsChecked" Value="{Binding TBState}"/>
        </Style>
        
        <Style TargetType="ListBox" x:Key="LBStyle">
            <Setter Property="ItemTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <ToggleButton Style="{StaticResource TBStyle}"/>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Margin" Value="5"/>
            <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <WrapPanel IsItemsHost="True"/>
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
        </Style> 
    </Window.Resources>
    
    <Grid Name="MainGrid">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
 
        <Button Grid.Row="0" Grid.ColumnSpan="3" Click="ButtonSave_Click" Content="Save"/>
        <Button Grid.Row="1" Grid.ColumnSpan="3" Click="ButtonLoad_Click" Content="Load"/>
 
        <!-- ListBox1 -->
        <ListBox Grid.Row="2" Grid.Column="0"
                 Style="{StaticResource LBStyle}"
                 ItemsSource="{Binding ListBox1Source, RelativeSource={RelativeSource AncestorType=Window}}"/>
        <!-- ListBox2 -->
        <ListBox Grid.Row="2" Grid.Column="1"
                 Style="{StaticResource LBStyle}"
                 ItemsSource="{Binding ListBox2Source, RelativeSource={RelativeSource AncestorType=Window}}"/>
        <!-- ListBox3 -->
        <ListBox Grid.Row="2" Grid.Column="2"
                 Style="{StaticResource LBStyle}"
                 ItemsSource="{Binding ListBox3Source, RelativeSource={RelativeSource AncestorType=Window}}"/>
        
    </Grid>
    
</Window>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Linq;
 
namespace WpfApplication3
{
    public class TB : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
 
        private string tbName;
        public string TBName { get { return tbName; } set { tbName = value; OnPropertyChanged("TBName"); } }
        private bool tbState;
        public bool TBState { get { return tbState; } set { tbState = value; OnPropertyChanged("TBState"); } }
 
        public TB(string Name, bool State)
        {
            TBName = Name;
            TBState = State;
        }
    }
 
    /// <summary>
    /// Логика взаимодействия для ToggleButtonWindow.xaml
    /// </summary>
    public partial class ToggleButtonWindow : Window, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
 
        private ObservableCollection<TB> listBox1Source = new ObservableCollection<TB>();
        public ObservableCollection<TB> ListBox1Source { get { return listBox1Source; } set { listBox1Source = value; OnPropertyChanged("ListBox1Source"); } }
 
        private ObservableCollection<TB> listBox2Source = new ObservableCollection<TB>();
        public ObservableCollection<TB> ListBox2Source { get { return listBox2Source; } set { listBox2Source = value; OnPropertyChanged("ListBox2Source"); } }
 
        private ObservableCollection<TB> listBox3Source = new ObservableCollection<TB>();
        public ObservableCollection<TB> ListBox3Source { get { return listBox3Source; } set { listBox3Source = value; OnPropertyChanged("ListBox3Source"); } }
 
 
 
 
        public ToggleButtonWindow()
        {
            InitializeComponent();
 
            for (int i = 1; i < 10; i++)
            {
                ListBox1Source.Add(new TB("TB" + i.ToString(), false));
                ListBox2Source.Add(new TB("TB" + i.ToString(), false));
            }
 
            for (int i = 1; i < 7; i++)
                ListBox3Source.Add(new TB("TB" + i.ToString(), false));
 
            ListBox1Source[4].TBState = true;
            ListBox2Source[4].TBState = true;
            ListBox3Source[4].TBState = true;
            ListBox3Source[5].TBState = true;
        }
 
 
        private void ButtonSave_Click(object sender, RoutedEventArgs e)
        {
            using (StreamWriter sw = new StreamWriter(@"F:\TEMP\ToggleButtons.txt"))
            {
                foreach (TB CurrTB in ListBox1Source)
                {
                    sw.WriteLine(CurrTB.TBName);
                    sw.WriteLine(CurrTB.TBState);
                }
                sw.WriteLine(string.Empty);
                foreach (TB CurrTB in ListBox2Source)
                {
                    sw.WriteLine(CurrTB.TBName);
                    sw.WriteLine(CurrTB.TBState);
                }
                sw.WriteLine(string.Empty);
                foreach (TB CurrTB in ListBox3Source)
                {
                    sw.WriteLine(CurrTB.TBName);
                    sw.WriteLine(CurrTB.TBState);
                }
            }
        }
 
        private void ButtonLoad_Click(object sender, RoutedEventArgs e)
        {
            using (StreamReader sr = new StreamReader(@"F:\TEMP\ToggleButtons.txt"))
            {
                ListBox1Source.Clear();
                ListBox2Source.Clear();
                ListBox3Source.Clear();
 
                string AllRows = sr.ReadToEnd();
                string[] Sources = AllRows.Split(new string[] { "\r\n\r\n" }, System.StringSplitOptions.None);
 
                FillSource(Sources[0], ListBox1Source);
                FillSource(Sources[1], ListBox2Source);
                FillSource(Sources[2], ListBox3Source);
            }
        }
 
        private void FillSource(string Source, ObservableCollection<TB> LTSource)
        {
            string[] StrArr = Source.Trim().Split(new string[] { "\r\n" }, System.StringSplitOptions.None);
            for (int i = 0; i < StrArr.Length; i += 2)
                LTSource.Add(new TB(StrArr[i], StrArr[i + 1].Equals("True")));
        }
    }
}
2
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
14.12.2018, 15:38  [ТС]
Я Вас понял. Но я все-равно "добью" как-нибудь "проект". Приложение уже сохраняет в файл и считывает из него обратно. Спасибо за помощь.

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У Вас структура Окна жёсткая. Вся работа с элементами проводится в CB. Работаете со всеми элементами по их именам. Имена Grid известны.
Для Вашего подхода, сохранение коллекции состояний кнопок каждого Grid, наверное, лучший вариант.
Только я не понял как это связанно с названием темы "Получить имя родительского объекта"?
Что касается самой реализации, то Вам надо было сначала посоветоваться о способах реализации такого приложения. Переделывать сейчас..... можно. Но сомневаюсь, что Вы будете. По сути всё, что сделано на данный момент, придётся отправить в мусор.
Для примера посмотрите маленький XAML из темы Audio + WPF
Так же и у Вас. Вам надо было создать нормальную Модель данных и потом просто подключить её к окну. Из-за отсутствия Модели, Вы её неявное реализовали в CB окна явно работая с элементами. Поэтому и куча неспецифических для WPF проблем для которых не существует общего типового решения. Приходится изобретать костыли.
Я Вас понял. Но я все-равно "добью" как-нибудь "проект". Приложение уже сохраняет в файл и считывает из него обратно. Спасибо за помощь.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 2
14.12.2018, 15:53
Цитата Сообщение от asdfg15432 Посмотреть сообщение
Но я все-равно "добью" как-нибудь "проект".
Да, я понял - что переделывать для Вас не вариант.
Только не пойму чем помочь Вам можно. Или Вы уже решили проблему по теме? Я имею ввиду - "Получить имя родительского объекта".
0
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
15.12.2018, 10:41  [ТС]
Нет, не решил. Более того: после упаковки всех кнопок в Viewbox уже и не записываются нажатые клавиши в файл.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,171
Записей в блоге: 2
15.12.2018, 14:55
Лучший ответ Сообщение было отмечено asdfg15432 как решение

Решение

Цитата Сообщение от asdfg15432 Посмотреть сообщение
Нет, не решил. Более того: после упаковки всех кнопок в Viewbox уже и не записываются нажатые клавиши в файл.
В вашей структуре окна, надо в Grid перебирать не кнопки, а ViewBox. В ViewBox в свою очередь, смотреть тип вложения и собрать в список имена всех включённых кнопок.
Вот пример, если левый Grid будет с именем GridLeft
C#
1
2
3
4
5
6
7
        private void ButtonSave_Click(object sender, RoutedEventArgs e)
        {
            List<string> GridLeftButtonIsCheked = new List<string>();
            foreach (Viewbox viewbox in GridLeft.Children.OfType<Viewbox>())
                if (viewbox.Child is ToggleButton toggleButton && toggleButton.IsChecked==true)
                    GridLeftButtonIsCheked.Add(toggleButton.Name);
        }
Добавлено через 1 минуту
На выходе в списке GridLeftButtonIsCheked имена всех ToggleButton которые включены и которые "завёрнуты" в Viewbox

Добавлено через 6 минут
А таким образом из списка можно восстановить состояние кнопок
C#
1
2
3
4
5
6
7
        private void ButtonLoad_Click(object sender, RoutedEventArgs e)
        {
            List<string> GridLeftButtonIsCheked = new List<string>() {/* Список имён кнопок */ };
            foreach (Viewbox viewbox in GridLeft.Children.OfType<Viewbox>())
                if (viewbox.Child is ToggleButton toggleButton)
                    toggleButton.IsChecked = GridLeftButtonIsCheked.IndexOf(toggleButton.Name) >= 0;
        }
Это конечно без учёта третьего состояния кнопки. IsCheked может быть null. Но, насколько понял, Вы это состояние не учитываете.
1
2 / 2 / 0
Регистрация: 07.04.2015
Сообщений: 358
15.12.2018, 15:02  [ТС]
Спасибо. Я тоже эту проблему решил)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.12.2018, 15:02

Как получить доступ к полю родительского объекта
Доброго времени суток! Сразу уточню: вопрос не про наследование, а про отношения parent/child Задача - получить значения поля из...

PostCreate() выдаёт ошибку во время удаления родительского объекта base.OnDie(prejudicial)
Новый объект создаётся во время удаления существующего объекта - error. Откуда начинать искать ошибку?

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

Получить имя устройства на COM-порте
Добрый день. У меня есть несколько экземпляров класса SerialPort. Нужно получить имя устройства, подключенного на каждый из портов....

Получить имя пользователя по IP-адресу
Возможно ли такое?


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru