在FlowDocument中选择WPF UIElement

时间:2010-10-10 23:05:11

标签: c# wpf checkbox flowdocument uielement

我有一个FlowDocument(在RichTextBox内),其中包含UIElementCheckBox个控件。我需要用户能够点击CheckBox来选择它来更改控件属性,例如标签,背景颜色等。

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

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

我已经尝试过搜索这个但是不知道要继续前进的方向。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

这个答案并不令人满意,但除了构建自定义ControlTemplate之外,这是最简单的(虽然可能是最丑陋的)。

假设我们有一个名为“eins”的CheckBox,我们将使用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的实际父级是什么类型的Control 3)你需要完成检查错误,这可能不会开箱即用 4)这不是真正的性能构建