是否可以使TextBox在默认情况下被禁用,但在用户双击时会启用?
答案 0 :(得分:4)
您可以将TextBox放在StackPanel中,如下所示:
<StackPanel MouseLeftButtonDown="StackPanel_MouseDown">
<TextBox Name="textBox1"/>
</StackPanel>
然后在StackPanel事件处理程序中:
private void StackPanel_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount >= 2)
{
textBox1.IsEnabled = true; //only hit here on DoubleClick
}
}
您还可以按照此问题所述模拟StackPanel DoubleClick:
答案 1 :(得分:3)
这是非常不寻常的,当禁用控件时,预计不会获得输入。看到禁用控件的用户通常甚至不会尝试单击/双击它。
也许您可以添加一个复选框来启用它(或属于它的功能),或者在不允许/意图双击它时显示一个消息框。在这种情况下,您还可以清楚地添加无法双击的原因。
我之前看到的是在控件之前没有文本的复选框。单击该复选框后,它将启用控件(在您的案例中为文本框)。您甚至可以使用复选框的工具提示来提供复选框正在执行的帮助信息。
答案 2 :(得分:2)
我会尝试附加到PreviewMouseDown事件并在那里启用/禁用。
否则你将不得不做旧的VB6技巧,在文本框上方有一个透明控件来接收点击事件。
答案 3 :(得分:0)
这个问题很旧,但是也许我可以帮助找到解决方案的人。 在最近的项目中,我需要模拟两种状态:查看和编辑。我已经使用文本框进行了此操作。在视图状态下,将显示值,但是您无法在控件上单击以获取焦点。要启用编辑模式,您需要双击控件。为了避免控件通过单击而集中注意力以及禁用它的弊端,我使用了两个预览事件来控制文本框的行为,并使文本框的响应适应应用程序需求和状态。事件之一是PreviewMouseDown:
private void tbxVariable_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if(!tbxVariable.IsFocused && e.ChangedButton == MouseButton.Left)
e.Handled = true;
}
在这种情况下,如果我们的文本框尚未聚焦,我们将阻止鼠标按下按钮。这样可以防止文本框获得焦点。因此它的行为就像标签。当控件成为焦点时,此事件不会被阻止,并且会传播到控件。请注意,您可能需要更改光标,因为当鼠标悬停在控件上时会使用编辑光标。还要注意,我们只阻塞了左键。
第二个事件如下:
private void tbxVariable_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left && !tbxVariable.IsFocused)
tbxVariable.Focus();
}
在第二个事件中,如果尚未聚焦,我们将通过鼠标左键单击将焦点移到控件上。如果控件具有焦点,那么我们将让事件传播,并且控件将正常运行。
对于我来说,我为文本框创建了一种特殊的样式,该样式保留了边框,背景和所有样式行为。这是XAML代码:
<Style x:Key="InlineEditorTextBox" TargetType="{x:Type TextBox}">
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="KeyboardNavigation.TabNavigation" Value="None" />
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="MinWidth" Value="5" />
<Setter Property="MaxHeight" Value="16" />
<Setter Property="AllowDrop" Value="false" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBoxBase}">
<ScrollViewer Margin="0" x:Name="PART_ContentHost" VerticalScrollBarVisibility="Disabled" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>