如何更改TextCompositionEventArgs中的文本



C#WPF-我有一个自定义的可编辑数据网格,它使用我自己的自定义列,这些列继承自DataGridTextColumn。在我的列类中,我覆盖GenerateEditingElement,这样我就可以自动设置MaxLength、CharacterCasing等。

问题是,当用户高亮显示一个单元格,然后键入他们的第一个字符时,数据网格会自动进入编辑模式。因此,我的GenerateEditingElement启动,我可以设置文本框。不幸的是,这对于字符大小写来说已经太晚了,而且TextCompositionEventArgs中已经有了小写字符。后续类型的字符大小写正确。

接下来激发的是列类PrepareCellForEdit,它具有TextCompositionEventArgs。然而,我似乎无法更改文本。我收到了setter不可用的编译错误。(尽管属性的intellisense帮助中确实说明了get和set)。

有没有什么可以通过编程将我的字符大小写放入文本框中?或如何更改TextCompositionEventArgs中的文本?

主要思想是订阅TextBox的TextChanged事件。但问题是,您不能直接在这个事件处理程序上更新Text属性。你必须稍微拖延一下才能做到这一点。下面是一个工作正常的例子:

    public struct MyData
    {
        public string Name { set; get; }
    }
    public MainWindow()
    {
        InitializeComponent();
        ObservableCollection<MyData> oc = new ObservableCollection<MyData> { new MyData(), new MyData() };
        grid.ItemsSource = oc;
    }
    private void Grid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        var col = new DataGridTextColumn();
        Style myStyle = new Style(typeof(TextBox));
        // subsribe to TextChanged event
        myStyle.Setters.Add(new EventSetter(TextBoxBase.TextChangedEvent, new TextChangedEventHandler(OnTextChanged)));
        col.EditingElementStyle = myStyle;
        var binding = new Binding("Name") {Mode = BindingMode.TwoWay};
        col.Binding = binding;
        e.Column = col;
    }
    private static void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += Worker_DoWork;
        worker.RunWorkerAsync(textBox);
        worker.RunWorkerCompleted += Worker_RunWorkerCompleted;          
    }
    static void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        TextBox textBox = e.Result as TextBox;
        if (textBox != null)
        {
            textBox.Text = textBox.Text.ToUpper();
            textBox.CaretIndex = textBox.Text.Length;
        }
    }
    static void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
        Thread.Sleep(1);// This is the trick :)
        e.Result = e.Argument;
    }

相关内容

  • 没有找到相关文章

最新更新