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