Выберите элемент WPF UIElement в FlowDocument - PullRequest
2 голосов
/ 11 октября 2010

У меня есть FlowDocument (внутри RichTextBox), который содержит UIElement элементы управления, такие как CheckBox es.Мне нужно, чтобы пользователь мог щелкнуть CheckBox, чтобы выбрать его, чтобы изменить свойства элементов управления, такие как метка, цвет фона и т. Д.

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я нажимаю на него, он только проверяетили снимите флажок CheckBox, как и следовало ожидать.Как бы я CheckBox отображал границу вокруг себя при нажатии и не изменял проверенное значение.Если для свойства IsEnabled установлено значение false, это означает, что я вообще не могу получить доступ к элементу управления, он не распознается.

Полагаю, самое простое объяснение того, чего я пытаюсь достичь, аналогично Expression Blend, илиVisual Studio визуальный дизайнер.Когда пользователь щелкает CheckBox, он выбирается, а не переключается проверенное значение.

Я пытался все это искать, но не знаю, в каком направлении двигаться дальше.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 12 октября 2010

Этот ответ не удовлетворяет, но помимо создания пользовательского ControlTemplate, это было самым простым (хотя, вероятно, и самым уродливым) занятием.

Предполагая, что у нас есть CheckBox по имени "eins"мы бы использовали 3 события для определения его состояний:

public void eins_Click(object sender, RoutedEventArgs e)
    {
        var _sender = sender as CheckBox;
        if (_sender.Tag == null || _sender.Tag.ToString() != "pressedOnce")
        {
            _sender.Tag = "pressedOnce";
            _sender.IsChecked = false;


            testStack.Children.Remove(_sender);

            Border border = new Border()
            {
                BorderThickness = new Thickness(2),
                BorderBrush = new SolidColorBrush(Colors.Cyan),
            };
            border.Child = _sender;
            testStack.Children.Insert(0, border);
        }

        else
        {
            _sender.IsChecked = true;
        }
    }

    private void eins_LostFocus(object sender, RoutedEventArgs e)
    {
        var _sender = sender as CheckBox;
        _sender.Tag = "";
        var border = _sender.Parent as Border;
        border.Child = null;
        testStack.Children.Remove(border);
        testStack.Children.Insert(0,_sender);
    }

    private void eins_Checked(object sender, RoutedEventArgs e)
    {
        DispatcherTimer timer = new DispatcherTimer()
        { 
           Interval = new TimeSpan(0,0,1) 
        };
        timer.Tick += new EventHandler(timer_Tick);
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        if (eins.IsChecked == true)
        { 
            //do whatever you want to do
        }
    }

Теперь это скорее обходное решение и имеет несколько недостатков:

1) вам нужно убедиться, что флажок никогда не установлендольше 1 секунды, иначе вам нужно увеличить TimeSpan
2) Вам всегда нужно знать, какой тип элемента управления является фактическим родителем флажка
3) Вам нужно будет закончить проверку на наличие ошибок, это, вероятно, выигралоне работает "из коробки"
4) Это не совсем сборка для производительности

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