在wpf中启用禁用的文本框



是否可以有一个默认禁用的TextBox,但当用户双击它时就会启用它?

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

这是非常不寻常的,而且当控件被禁用时,它也不会得到输入。看到禁用控件的用户通常不会尝试点击/双击它。

也许你可以添加一个复选框来启用它(或属于它的功能),或者在不允许/不想双击它时显示一个消息框。在这种情况下,你也可以清楚地添加无法双击它的原因。

我以前看到的是控件前面没有文本的复选框。当您单击复选框时,它会启用它后面的控件(在您的情况下为文本框)。您甚至可以使用复选框的工具提示来提供复选框执行操作的帮助信息。

我会尝试附加到PreviewMouseDown事件并在那里启用/禁用。

否则,您将不得不执行旧的VB6技巧,在文本框上方有一个透明控件来接收点击事件。

这个问题很老,但也许我可以帮助找到解决方案的人。在最近的一个项目中,我需要模拟两种状态:查看和编辑。我用了一个文本框。在视图状态下,会显示值,但单击控件无法获得焦点。要启用编辑模式,您需要双击控件。为了避免控件通过点击它而获得焦点,以及禁用它的缺点,我使用了两个预览事件来控制文本框的行为,并根据应用程序的需求和状态调整它的响应。其中一个事件是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>

相关内容

  • 没有找到相关文章

最新更新