2

我有一个FlowDocument(在 a 内RichTextBox),其中包含UIElement诸如CheckBoxes 之类的控件。我需要用户能够单击CheckBox以选择它来更改控件属性,例如标签、背景颜色等。

我遇到的问题是,当我单击它时,它只会检查或取消选中CheckBox您所期望的。单击时如何CheckBox在自身周围显示边框而不更改选中的值。将IsEnabled属性设为 false 意味着我什至根本无法访问该控件,它无法被识别。

我想我想要实现的最简单的解释类似于 Expression Blend 或 Visual Studio 视觉设计器。当用户单击 aCheckBox时,它会被选中,而不是选中的值切换。

我已经尝试过到处搜索,但不知道该往哪个方向前进。任何帮助,将不胜感激。

4

1 回答 1

0

这个答案并不令人满意,但除了构建一个 custom 之外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)这并不是真正为性能而构建的

于 2010-10-11T23:17:18.733 回答