首页 文章

在FlowDocument中选择WPF UIElement

提问于
浏览
2

我有 FlowDocument (在 RichTextBox 内)包含 UIElement 控件,如 CheckBox es . 我需要用户能够单击 CheckBox 来选择它来更改控件属性,如标签,背景颜色等 .

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

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

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

1 回答

  • 0

    这个答案并不令人满意,但除了 Build 自定义 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)这不是真正的性能

相关问题