2010-10-10 3 views
2

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

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

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

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

ответ

0

Этот ответ не является удовлетворительным, но, помимо создания пользовательского 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) Вам всегда нужно знать, какой тип элемента управления является фактическим родителем Checkbox
3) Вам понадобится закончить проверку ошибки, это, вероятно, не сработает из коробки
4) Это не очень важно для производительности

+1

Ответ (с тех пор как я узнал) - это использование украшений. Они предназначены именно для этой цели. Просто нужно копать в них больше, поскольку у меня пока мало опыта с ними. – dgwyer

+0

Мне, вероятно, придется тоже копаться в них. :) Спасибо за хедз-ап – Semyazas

+0

Рисование украшений поверх flowdocs? –