Создание пользовательского стиля флажка WPF чисто в коде позади - PullRequest
0 голосов
/ 24 января 2011

Я пытаюсь создать пользовательский элемент управления CheckBox, который в идеале будет представлен синим крестом, который меняет светлый оттенок синего при возникновении события мыши при наведении курсора мыши и запускает событие Click при нажатии.

Я видел способы сделать это в коде XAML с использованием шаблонов и стилей управления, но не только в коде.Я уже создал пользовательские стили в коде и применил их достаточно хорошо, но у меня возникли проблемы с количеством настроек, необходимых на этот раз, например, с заменой всего флажка изображением синего креста.

Кто-нибудь знает стандартный способ сделать это?Можете ли вы создать полностью шаблонный стиль в коде XAML, а затем ссылаться на этот шаблон при установке свойств для нового объекта флажка в коде позади?

Заранее спасибо.

1 Ответ

2 голосов
/ 24 января 2011

Я ненавижу это делать, так как это разрушает подход декларации с XAML, но бывают случаи, когда вам нужно это делать.

При этом обратите внимание на класс FrameworkElementFactory для создания своего XAML. Это довольно аккуратный образец. Следующий фрагмент показывает, где я создал DataTemplate для ListView в коде. Мне нужно было динамически добавлять элементы в зависимости от количества дней в месяце для приложения для составления отчетов о времени.

       GridView gv = new GridView();
        int i = 0;
        foreach (string s in vm.DateList)
        {
            string column = string.Format("DisplayTime[{0}].Hours", i);
            DataTemplate dt = new DataTemplate();

            DateTime date = DateTime.Parse(s);

            bool isWeekday = true;

            if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday)
            {
                isWeekday = false;
            }

            Binding binding = new Binding();
            binding.Path = new PropertyPath(column);
            binding.Mode = BindingMode.TwoWay;

            FrameworkElementFactory gridElement = new FrameworkElementFactory(typeof(Grid));
            gridElement.SetValue(Grid.WidthProperty, 60.0);
            gridElement.SetValue(Grid.HeightProperty, 94.0);
            gridElement.SetValue(Grid.MarginProperty, new Thickness(0.0, 0.0, 0.0, 4.0));

            if (!isWeekday)
            {
                gridElement.SetValue(Grid.BackgroundProperty, new SolidColorBrush(Color.FromRgb(65, 65, 65)));
            }


            FrameworkElementFactory txtelement = new FrameworkElementFactory(typeof(TextBox));
            txtelement.SetBinding(TextBox.TextProperty, binding);
            txtelement.SetValue(TextBox.WidthProperty, 40.0);
            txtelement.SetValue(TextBox.HeightProperty, 20.0);
            txtelement.SetValue(TextBox.VerticalAlignmentProperty, VerticalAlignment.Center);
            txtelement.SetValue(TextBox.HorizontalAlignmentProperty, HorizontalAlignment.Center);
            txtelement.SetValue(TextBox.TextAlignmentProperty, TextAlignment.Right);

            gridElement.AppendChild(txtelement);

            dt.VisualTree = gridElement;

            gv.Columns.Add(new GridViewColumn()
            {
                Header = s,
                //                            DisplayMemberBinding = new Binding(column),
                CellTemplate = dt
            });
            i++;
        }

        ETCListView.View = gv;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...