powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Combobox ToogleButton Visibility
3 сообщений из 3, страница 1 из 1
Combobox ToogleButton Visibility
    #38922491
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как сделать так, чтобы ToggleButton отображался только при наведении на контрол?
Пытаюсь через стили, но как-то не очень получается.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<Style x:Key="cbStyle" TargetType="ComboBox">
            <Setter Property="BorderThickness" Value="0"/>
            <Setter Property="BorderBrush" Value="Transparent"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ToggleButton">
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="false">
                                <Setter Property="Visibility" Value="Hidden" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
...
Рейтинг: 0 / 0
Combobox ToogleButton Visibility
    #38923128
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

Ваша ошибка в том, что вы пытаетесь подсунуть для контрола ComboBox, шаблон для ToggleButton.
Самый простой пусть, это скопировать шаблон по умолчанию для ComboBox'а и там добавить триггер на IsMouseOver, но тогда пропадет стилизация контрола в зависимости от темы Windows.
Но можно, например, сделать вот так:
это не очень правильный метод, но он рабочий =)

Код: 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.
    public class ComboBoxEx : ComboBox
    {
        private ToggleButton _toggleButton;
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            _toggleButton = FindChild<ToggleButton>(this);
            var desc = TypeDescriptor.GetProperties(typeof(UIElement))["IsMouseOver"];
            desc.AddValueChanged(this, OnChanged);
        }

        private void OnChanged(object sender, EventArgs e)
        {
            Debug.Print("1");
            if (_toggleButton == null) return;
            _toggleButton.Opacity = IsMouseOver ? 1.0 : 0.0;
        }


        public static T FindChild<T>(DependencyObject parent, string childName = null) where T : DependencyObject
        {
            // Confirm parent and childName are valid. 
            if (parent == null) return null;

            T foundChild = null;

            int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < childrenCount; i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                // If the child is not of the request child type child
                T childType = child as T;
                if (childType == null)
                {
                    // recursively drill down the tree
                    foundChild = FindChild<T>(child, childName);

                    // If the child is found, break so we do not overwrite the found child. 
                    if (foundChild != null) break;
                }
                else if (!string.IsNullOrEmpty(childName))
                {
                    var frameworkElement = child as FrameworkElement;
                    // If the child's name is set for search
                    if (frameworkElement != null && frameworkElement.Name == childName)
                    {
                        // if the child's name is of the request name
                        foundChild = (T)child;
                        break;
                    }
                }
                else
                {
                    // child element found.
                    foundChild = (T)child;
                    break;
                }
            }

            return foundChild;
        }
    }
...
Рейтинг: 0 / 0
Combobox ToogleButton Visibility
    #38923132
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или вот такой вариант ) с анимашками

Код: 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.
    public class ComboBoxEx : ComboBox
    {
        private ToggleButton _toggleButton;
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            _toggleButton = FindChild<ToggleButton>(this);
            _toggleButton.Opacity = 0.0;
            var desc = TypeDescriptor.GetProperties(typeof(UIElement))["IsMouseOver"];
            desc.AddValueChanged(this, OnChanged);
        }

        private void OnChanged(object sender, EventArgs e)
        {
            if (_toggleButton == null) return;
            if (IsMouseOver)
                Show();
            else
                Hide();
        }

        private void Hide()
        {
            var animation = new DoubleAnimation
            {
                To = 0.0,
                Duration = TimeSpan.FromSeconds(0.5)
            };
            _toggleButton.BeginAnimation(OpacityProperty, animation);
        }
        private void Show()
        {
            var animation = new DoubleAnimation
            {
                To = 1.0,
                Duration = TimeSpan.FromSeconds(0.5)
            };
            _toggleButton.BeginAnimation(OpacityProperty, animation);
        }

        public static T FindChild<T>(DependencyObject parent, string childName = null) where T : DependencyObject
        {
            // Confirm parent and childName are valid. 
            if (parent == null) return null;

            T foundChild = null;

            int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < childrenCount; i++)
            {
                var child = VisualTreeHelper.GetChild(parent, i);
                // If the child is not of the request child type child
                T childType = child as T;
                if (childType == null)
                {
                    // recursively drill down the tree
                    foundChild = FindChild<T>(child, childName);

                    // If the child is found, break so we do not overwrite the found child. 
                    if (foundChild != null) break;
                }
                else if (!string.IsNullOrEmpty(childName))
                {
                    var frameworkElement = child as FrameworkElement;
                    // If the child's name is set for search
                    if (frameworkElement != null && frameworkElement.Name == childName)
                    {
                        // if the child's name is of the request name
                        foundChild = (T)child;
                        break;
                    }
                }
                else
                {
                    // child element found.
                    foundChild = (T)child;
                    break;
                }
            }

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


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