powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Задать XAML-часть контрола в его кодбехайнде
8 сообщений из 8, страница 1 из 1
Задать XAML-часть контрола в его кодбехайнде
    #38819159
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал простой контрол:

XAML:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<TreeView x:Class="EArchiveMaster.View.MyTreeView"
             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" 
             d:DesignHeight="300" d:DesignWidth="300">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
            <EventSetter Event="LostFocus" Handler="EventSetter_OnHandler" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>



code-behind:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public partial class MyTreeView
{
    public event Action SomeItemLostFocus;

    public MyTreeView()
    {
        InitializeComponent();
    }

    private void EventSetter_OnHandler(object sender, RoutedEventArgs e)
    {
        e.Handled = true;
        if (SomeItemLostFocus != null)
            SomeItemLostFocus();
    }
}



Однако, когда пытаюсь использовать контрол, получаю хорошо известную ошибку

Cannot set Name attribute value 'TextBox' on element 'TextBox'. 'TextBox' is under the scope of element 'MyTreeView', which already had a name registered when it was defined in another scope.

В качестве рецепта в гугле предлагают .XAML-часть контрола задавать в его code-behind-e. Вот тут и возникает следующая проблема - не представляю как это сделать.
...
Рейтинг: 0 / 0
Задать XAML-часть контрола в его кодбехайнде
    #38819513
Фотография @k@DElpher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то непонятно. Это должен быть UserControl или CustomControl?
...
Рейтинг: 0 / 0
Задать XAML-часть контрола в его кодбехайнде
    #38819531
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
@k@DElpher, не суть что, лишь бы работало :)

основной смысл в том, чтобы когда любой айтем в дереве теряет фокус - дерево кидало мое кастомное событие. я пока придумал только такую реализацию.
...
Рейтинг: 0 / 0
Задать XAML-часть контрола в его кодбехайнде
    #38819538
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
@k@DElpher,

вот здесь вроде есть "ответ". но я совершенно не представляю как в моем случае применить этот рецепт.
...
Рейтинг: 0 / 0
Задать XAML-часть контрола в его кодбехайнде
    #38819678
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrilla,

Keyboard.AddPreviewLostKeyboardFocusHandler(this, OnFocusLost);
если this - это форма, то метод OnFocusLost будет вызываться если контрол на форме потерял фокус, дальше сами думайте
...
Рейтинг: 0 / 0
Задать XAML-часть контрола в его кодбехайнде
    #38819682
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

надо заметить, что это не фокус объекта, а фокус ввода
...
Рейтинг: 0 / 0
Задать XAML-часть контрола в его кодбехайнде
    #38819774
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes, моя проблема не в невозможности присоединить обработчик события, а в невозможности прицепить обработчик именно к TreeViewItem-ам. Если у меня есть список этих айтемов - то обработчик я прицеплю. Нашел вот такой метод. Для дерева возвращает список его TreeViewItem-ов. Теперь я могу прицеплять обработчики.

Код: 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.
public static List<TreeViewItem> FindTreeViewItems(this Visual @this)
        {
            if (@this == null)
                return null;

            var result = new List<TreeViewItem>();

            var frameworkElement = @this as FrameworkElement;
            if (frameworkElement != null)
            {
                frameworkElement.ApplyTemplate();
            }

            Visual child = null;
            for (int i = 0, count = VisualTreeHelper.GetChildrenCount(@this); i < count; i++)
            {
                child = VisualTreeHelper.GetChild(@this, i) as Visual;

                var treeViewItem = child as TreeViewItem;
                if (treeViewItem != null)
                {
                    result.Add(treeViewItem);
                    if (!treeViewItem.IsExpanded)
                    {
                        treeViewItem.IsExpanded = true;
                        treeViewItem.UpdateLayout();
                    }
                }
                foreach (var childTreeViewItem in FindTreeViewItems(child))
                {
                    result.Add(childTreeViewItem);
                }
            }
            return result;
        }
...
Рейтинг: 0 / 0
Задать XAML-часть контрола в его кодбехайнде
    #38819775
monstrilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

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


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