WPF双击编辑标签

3
4个回答

4

我认为你需要处理一些事件(XAML代码中无法设置所有内容):

//Initially set Focusable to false
textBox1.Focusable = false;
textBox1.Cursor = Cursors.Arrow;

//FocusableChanged event handler for your textBox1
private void textBox1_FocusableChanged(object sender, 
                                       DependencyPropertyChangedEventArgs e){
  textBox1.Cursor = textBox1.Focusable ? Cursors.IBeam : Cursors.Arrow;
}
//MouseDoubleClick event handler for your textBox1
private void textBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e){
  textBox1.Focusable = true;
  textBox1.Focus();
  textBox1.CaretIndex = textBox1.Text.Length;
}
//LostFocus event handler for your textBox1
private void textBox1_LostFocus(object sender, RoutedEventArgs e){
  textBox1.Focusable = false;
}

我刚刚设计了一些非常相似的代码,但是我发现在双击事件之后,LostFocus 立即被触发。 - Joe

1
您可以创建一个如下的文本框:

textbox

TextBox editLbl = new TextBox();
//add it to the controls list to display it

将标签的所有属性设置为textbox,如locationsize等。

设置keydown事件,并在按下回车键时隐藏textbox并将值设置为标签。

您还可以将background color主题设置为与窗体窗口相同,以使其看起来像是在编辑标签。


我非常确定在任何WPF的上下文中都不存在Controls,也许你认为提问者使用的是winforms,但实际上他/她使用的是wpf - King King

1

如果您不使用MVVM,可以简单地执行以下操作

  • 创建一个带有标签和隐藏文本框的网格
  • 在标签双击事件中将文本框可见性设置为可见
  • 将文本框文本绑定到标签
  • 在文本框失去焦点事件中将文本框可见性设置为隐藏

1
这种方法对我很有效。在此线程中修复了先前的答案代码(在双击后立即触发LostFocus)。
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Interactivity;

public class DoubleClickTextBoxBehaviour : Behavior<TextBox>
{
    private long _timestamp;

    protected override void OnAttached()
    {
        AssociatedObject.Focusable = false;
        AssociatedObject.Cursor = Cursors.Arrow;

        AssociatedObject.MouseDoubleClick += AssociatedObjectOnMouseDoubleClick;
        AssociatedObject.LostFocus += AssociatedObjectOnLostFocus;
    }

    private void AssociatedObjectOnMouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if (e.ChangedButton != MouseButton.Left)
            return;

        if (AssociatedObject.Focusable)
            return;//fix an issue of selecting all text on double click

        AssociatedObject.Cursor = Cursors.IBeam;
        AssociatedObject.Focusable = true;
        AssociatedObject.Focus();
        AssociatedObject.CaretIndex = AssociatedObject.Text.Length;

        _timestamp = Stopwatch.GetTimestamp();
    }

    private void AssociatedObjectOnLostFocus(object sender, RoutedEventArgs e)
    {
        var delta = Stopwatch.GetTimestamp() - _timestamp;
        var timesp = new TimeSpan(delta);

        if (timesp.TotalSeconds < 1)
            return;

        AssociatedObject.Cursor = Cursors.Arrow;
        AssociatedObject.Focusable = false;
    }
}

将它附加到文本框:

<TextBox Text="{Binding MyText}">
    <i:Interaction.Behaviors>
        <behaviours:DoubleClickTextBoxBehaviour />
    </i:Interaction.Behaviors>
</TextBox>

如果出现错误。

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