powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / После привязки элемент управления не обрабатывает события
9 сообщений из 9, страница 1 из 1
После привязки элемент управления не обрабатывает события
    #38658162
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я в WPF новичок.

Был объявлен TreeView
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<TreeView x:Name="ProjTreeView"
          ItemsSource="{Binding}"
          Height="322" Width="218.701">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type model:Project}"
                                  ItemsSource="{Binding Path=Items}">
            <TextBlock Text="{Binding Name}"
                       Style="{StaticResource ProjectStyle}"/>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>


для TextBlock, который представляет елемент дерева сделан стиль
Код: 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.
<Style x:Key="ProjectStyle"
       TargetType="{x:Type TextBlock}">
    <Setter Property="Background"
            Value="Firebrick"/>
    <Setter Property="Foreground"
            Value="White"/>
    <Setter Property="FontSize"
            Value="20"/>
    <Setter Property="Padding"
            Value="5,5,5,5"/>
    <Setter Property="Margin"
            Value="5,5,5,5"/>
    
    <EventSetter Event="GotFocus"
                 Handler="TextBlock_GotFocus"/>
    
    <Style.Triggers>
        <Trigger Property="IsFocused"
                 Value="True">
            <Setter Property="Background"
            Value="Firebrick"/>
            <Setter Property="Foreground"
            Value="White"/>
        </Trigger>
        <Trigger Property="IsFocused"
                 Value="False">
            <Setter Property="Background"
            Value="White"/>
            <Setter Property="Foreground"
            Value="Firebrick"/>
        </Trigger>
    </Style.Triggers>
    
</Style>



но при этом элемент управления не возбуждает никаких событий, например GotFocus при щелчке мыши на элементе управления.
Соответственно свойства, связанные с этим событием, также не изменяются

Как заставить эти события возбуждаться?
...
Рейтинг: 0 / 0
После привязки элемент управления не обрабатывает события
    #38658243
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok,
Не знаю, зачем тебе событие GotFocus, но его я тоже добавил. При выделении объекта, получении фокуса и развёртывая на экране появляется MessageBox. Собственно, если нужно сделать отложенную загрузку в IsExpanded нужно реализовать загрузчик данных, добавить в базовый класс абстрактный метод (типа LoadChildren) и реализовывать его в классе Person. Ну, а если у тебя все ветки подгружаются сразу, то можно оставить как есть. Будут вопросы пиши
Код: 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.
    public class BindableStaticResource : StaticResourceExtension
    {
        public Binding Binding { get; set; }

        public BindableStaticResource()
        {
        }

        public BindableStaticResource(Binding binding)
        {
            Binding = binding;
        }
    }

    public abstract class TreeItem<T>
    {
        private bool _isSelected;
        private bool _isExpanded;

        public bool IsSelected
        {
            set
            { 
                _isSelected = value;
                MessageBox.Show("Элемент дерева выделился");
            }
            get { return _isSelected; }
        }

        public bool IsExpanded
        {
            set
            {
                _isExpanded = value;
                MessageBox.Show("Ветка дерева раскрылась");
            }
            get { return _isExpanded; }
        }

        public abstract ObservableCollection<T> Children { set; get; }
    }
    
    public class Person : TreeItem<Person>
    {
        public string Name { set; get; }
        public int Age { set; get; }
        public override ObservableCollection<Person> Children { set; get; }
    }



    static class DataLoader
    {
        public static ObservableCollection<Person> GetPersonList()
        {
            var result = new ObservableCollection<Person>
            {
                new Person
                {
                    Name = "Roman Mejtes",
                    Age = 30,
                    Children = new ObservableCollection<Person>
                    {
                        new Person
                        {
                            Name = "Olga Mejtes", 
                            Age = 5
                        }
                    }
                },
                new Person
                {
                    Name = "Sofia Nesterova",
                    Age = 34,
                    Children = new ObservableCollection<Person>
                    {
                        new Person
                        {
                            Name = "Aleksandr Nesterov", 
                            Age = 12
                        }
                    }
                }
            };
            return result;
        }

    }
    class Data
    {
        private readonly ObservableCollection<Person> _persons;

        public ObservableCollection<Person> Persons
        {
            get { return _persons; }
        }

        public Data()
        {
            _persons = new ObservableCollection<Person>(DataLoader.GetPersonList());
        }
        
    }


Код: 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.
<Window x:Class="WpfApplication9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication9"
        Title="MainWindow" Height="350" Width="525"
        x:Name="Window">
    <Window.Resources>
        <Style x:Key="ProjectStyle" TargetType="{x:Type TextBlock}">
            <Setter Property="Background" Value="Firebrick"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="FontSize" Value="20"/>
            <Setter Property="Padding" Value="5,5,5,5"/>
            <Setter Property="Margin" Value="5,5,5,5"/>

            <Style.Triggers>
                <Trigger Property="IsFocused" Value="True">
                    <Setter Property="Background" Value="Firebrick"/>
                    <Setter Property="Foreground" Value="White"/>
                </Trigger>
                <Trigger Property="IsFocused" Value="False"> 
                    <Setter Property="Background" Value="White"/>
                    <Setter Property="Foreground" Value="Firebrick"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <TreeView x:Name="ProjTreeView" ItemsSource="{Binding Persons}"> 
            <TreeView.Resources>
                <Style TargetType="{x:Type TreeViewItem}">
                    <EventSetter Event="GotFocus" Handler="EventSetter_OnHandler"/>
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
                    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
                </Style>
                <HierarchicalDataTemplate DataType="{x:Type my:Person}" ItemsSource="{Binding Children}">
                    <TextBlock Text="{Binding Name}" Style="{StaticResource ProjectStyle}"/>
                </HierarchicalDataTemplate>
            </TreeView.Resources>
        </TreeView>
    </Grid>
</Window>


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void EventSetter_OnHandler(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Событие GotFocus возбудилось");
        }
    }
...
Рейтинг: 0 / 0
После привязки элемент управления не обрабатывает события
    #38658261
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok,

и вообще TextBlock не имеет фокуса
...
Рейтинг: 0 / 0
После привязки элемент управления не обрабатывает события
    #38658293
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes, спасибо за отклик

Вообще, мне нужно, чтобы при выборе узла, он менял свой стиль (Background, BorderBrush, Foreground) + при этом выводилась дополнительная информация в другой элемент управления в зависимости от данных, привязанных к выбранному узлу.
Проблема с событием Selected с вашей помощью преодолена (тогда дейстивтельно мне GotFocus не требуется)
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<TreeView.Resources>
    <Style TargetType="{x:Type TreeViewItem}">
        <EventSetter Event="Expanded"
                     Handler="TreeViewItem_OnExpanded"/>
        <EventSetter Event="Selected"
                     Handler="TreeViewItem_OnSelected"/>
    </Style>    
</TreeView.Resources>



Но вот с изменением стиля - проблема остается, поскольку стиль должен применяется не ко всем узлам дерева, а к выбранным
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<TreeView.Resources>
    <Style TargetType="{x:Type TreeViewItem}">
        <EventSetter Event="Expanded"
                     Handler="TreeViewItem_OnExpanded"/>
        <EventSetter Event="Selected"
                     Handler="TreeViewItem_OnSelected"/>
    </Style>
    
    <HierarchicalDataTemplate DataType="{x:Type model:Project}"
                              ItemsSource="{Binding Path=Items}">
        <TextBlock Text="{Binding Name}"
                   Style="{StaticResource ProjectStyle}"/>
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate DataType="{x:Type model:Item}">
        <TreeViewItem Header="{Binding Path=Name}"/>
    </HierarchicalDataTemplate>    
</TreeView.Resources>


Для узлов, к которым привязан Project - свои настройки, для узлов с привязкой Item - свои
...
Рейтинг: 0 / 0
После привязки элемент управления не обрабатывает события
    #38658372
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok,

я не понимаю, зачем вы так сильно хотите использовать события, тут в них нет совершенно ни какой необходимости. Для того, чтоб меня внешний вид выделенного элемента можно воспользоваться триггером на свойство IsSelected
...
Рейтинг: 0 / 0
После привязки элемент управления не обрабатывает события
    #38658404
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Novichok,
вот вам пример, выделенный элемент меняет размер и "жирность" шрифта,
для этого я применил Trigger который меняет эти свойства, если элемент выделен, как только IsSelected перестает быть True, триггер отключается и применяются значения указанные в стиле. Почитайте про триггеры и еще про то в каком порядке\приоритете применяются значения к свойствам. Если они определены в стиле, триггере, объекте и т.д.

Код: 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.
<Window x:Class="WpfApplication9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication9"
        Title="MainWindow" Height="350" Width="525"
        x:Name="Window">
    <Grid>
        <TreeView x:Name="ProjTreeView" ItemsSource="{Binding Persons}"> 
            <TreeView.Resources>
                <Style TargetType="{x:Type TreeViewItem}">
                    <EventSetter Event="GotFocus" Handler="EventSetter_OnHandler"/>
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
                    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
                    <Setter Property="FontSize" Value="16"/>
                    <Setter Property="FontWeight" Value="Normal"/>
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="FontSize" Value="20"/>
                            <Setter Property="FontWeight" Value="ExtraBold"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
                <HierarchicalDataTemplate DataType="{x:Type my:Person}" ItemsSource="{Binding Children}">
                    <HierarchicalDataTemplate.Resources>
                        <Style TargetType="TreeViewItem">
                            <Setter Property="FontSize" Value="14"/>
                        </Style>
                    </HierarchicalDataTemplate.Resources>
                    <TextBlock x:Name="TextBlock" Text="{Binding Name}" Margin="2" />
                </HierarchicalDataTemplate>
            </TreeView.Resources>
        </TreeView>
    </Grid>
</Window>
...
Рейтинг: 0 / 0
После привязки элемент управления не обрабатывает события
    #38658538
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes_Novichok,

я не понимаю, зачем вы так сильно хотите использовать события, тут в них нет совершенно ни какой необходимости. Для того, чтоб меня внешний вид выделенного элемента можно воспользоваться триггером на свойство IsSelected
События мне не нужны для изменения стилей. События нужны для выполнения дополнительной логики, которая не касается TreeView, то есть вывод дополнительных данных в зависимости от объекта в узле дерева.
А стили нужно менять с помощью триггеров, при этом не затрагивая и не переписывая модель

Поэтому код, приведенный вами,
Код: c#
1.
2.
3.
4.
5.
6.
    public class Person : TreeItem<Person>
    {
        public string Name { set; get; }
        public int Age { set; get; }
        public override ObservableCollection<Person> Children { set; get; }
    }

к сожалению не подходит

Модель находится в другой сборке и используется совместно в других проектах, поэтому подгонять ее под WPF было бы не совсем хорошо
...
Рейтинг: 0 / 0
После привязки элемент управления не обрабатывает события
    #38658685
Фотография @k@DElpher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot _Novichok]Roman Mejtes_Novichok,

Модель находится в другой сборке и используется совместно в других проектах, поэтому подгонять ее под WPF было бы не совсем хорошо
Не вдавался в подробности треда, но написание обертки ViewModel над моделью для конкретной View нормальная практика (пусть модель остается общей, но для представления её стоит обернуть).
...
Рейтинг: 0 / 0
После привязки элемент управления не обрабатывает события
    #38659975
Фотография _Novichok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@k@DElpher, Roman Mejtes,
Проблему с установкой стилей в зависимости от выбранного узла решил следующим образом:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
internal class TreeViewItemStyleSelector : StyleSelector
{
    public Style ProjectStyle { get; set; }
    public Style ItemStyle { get; set;}
    public Style RootStyle { get; set; }

    public override Style SelectStyle(object item, DependencyObject container)
    {
        ItemsControl ctrl = ItemsControl.ItemsControlFromItemContainer(container);
        if (item.GetType() == typeof (Project))
        {
            return ProjectStyle;
        }
        if (item.GetType() == typeof(Item))
        {
            return ItemStyle;
        }
        return RootStyle;
    }
}


XAML:
Код: xml
1.
2.
3.
4.
5.
6.
<TreeView.ItemContainerStyleSelector>
    <ui:TreeViewItemStyleSelector
        ProjectStyle="{StaticResource ProjectTreeViewItemStyle}"
        ItemStyle="{StaticResource ItemTreeViewItemStyle}"
        />
</TreeView.ItemContainerStyleSelector>


а в стилях триггеры и все остальное
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / После привязки элемент управления не обрабатывает события
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]