在WPF中启用一个禁用的文本框

3

是否可以默认禁用文本框,但在用户双击时启用它?

4个回答

7
您可以将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双击:

WPF StackPanel同时支持单击和双击


非常有创意的解决方案,注意双击必须在一定时间内完成。 - Michel Keijzers
1
@Michel Keijzers 谢谢!如果你喜欢它,那就点个赞吧。每个DoubleClick都必须在一定的时间段内完成。我添加了一个问题,涉及到模拟这种情况的多种方式。 - Dor Cohen
亲爱的Dor,我尝试了你的答案,但clickcount从未大于1。 - user1223444
一样的。 你自己用过吗? - user1223444
所以,我正在一个itemscontrol中使用这个,这是问题吗? - user1223444
显示剩余2条评论

3
这很不寻常,当控件被禁用时,不应该能够输入。看到禁用的控件,用户通常不会尝试单击/双击它。
也许您可以添加一个复选框来启用它(或其所属的功能),或者在不允许/意味着双击时显示一个消息框。在这种情况下,您还可以清楚地说明为什么不能双击。
我以前见过的是,在控件之前没有文本的复选框。当您单击复选框后面的控件时,它会启用(在您的情况下为文本框)。您甚至可以使用工具提示为复选框提供帮助信息,解释复选框的作用。

能否请给这个替代方案点踩的人留下一个评论,说明原因? - Michel Keijzers
1
不是我,但我猜想他/她认为你没有满足他们对问题的期望。 - Dor Cohen
是的,我应该也写一些关于问题本身的内容,而不是直接提供一个替代方案。感谢您的发布。 - Michel Keijzers

2
我会尝试在PreviewMouseDown事件上附加并在那里启用/禁用。
否则,您将不得不使用旧的VB6技巧,在文本框上方放置一个透明控件来接收单击事件。

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接