我有一个FlowDocument
(在RichTextBox
内),其中包含UIElement
个CheckBox
个控件。我需要用户能够点击CheckBox
来选择它来更改控件属性,例如标签,背景颜色等。
我遇到的问题是,当我点击它时,它只会检查或取消检查CheckBox
,如您所料。单击时如何让CheckBox
在其周围显示边框,而不更改选中的值。将IsEnabled
属性设为false意味着我根本无法访问控件,因此无法识别。
我想我想要实现的最简单的解释类似于Expression Blend或Visual Studio可视化设计器。当用户点击CheckBox
时,它会被选中,而不是选中的值切换。
我已经尝试过搜索这个但是不知道要继续前进的方向。任何帮助将不胜感激。
答案 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)这不是真正的性能构建