Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 插入符号在WPF自定义文本框控件中的位置错误_C#_.net_Wpf_Wpf Controls_Custom Controls - Fatal编程技术网

C# 插入符号在WPF自定义文本框控件中的位置错误

C# 插入符号在WPF自定义文本框控件中的位置错误,c#,.net,wpf,wpf-controls,custom-controls,C#,.net,Wpf,Wpf Controls,Custom Controls,我正在尝试创建一个自定义控件(从TextBox继承)。主要目标是用户键入时自动格式化。此控件仅接受数字,并使用数字分组分隔符和十进制分隔符自动完成输入 Generic.xaml的内容如下: <Style TargetType="{x:Type local:PrecisionTextBox}"> <Setter Property="Template"> <Setter.Value>

我正在尝试创建一个自定义控件(从TextBox继承)。主要目标是用户键入时自动格式化。此控件仅接受数字,并使用数字分组分隔符和十进制分隔符自动完成输入

Generic.xaml的内容如下:

<Style TargetType="{x:Type local:PrecisionTextBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:PrecisionTextBox}">
                <TextBox Text="{Binding Path=TextContent, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>   
 </Style>
除了一件事,它工作得很好。插入符号。。。我键入了一个“0”字符,在此之前一切正常:

之后,我又键入了一个“0”号,插入符号出现在错误的位置:

我希望插入符号靠近下一个角色。我想我知道原因。输入接收到我的3个字符(默认显示为0.00),插入符号为3。位置。但我想同步这个插入符号。我试图设置CaretIndex和SelectionStart属性,但它们都不起作用

欢迎提出任何建议。谢谢。

可能您应该使用而不是进行字符串替换

我在这里解决了这个问题:

这并不适用于完全相同的数字格式,它只适用于带有千个分隔符的数字字符串,它没有小数位数,但我相信您可以更改代码以满足您的格式要求

public string TextContent
    {
        get
        {                
            return this.Value.ToString("N" + Precision);  
        }
        set
        {
            if (value != textContent)
            {
                textContent = value;

                if (textContent.Contains(MultiplierChar))
                {
                    textContent = textContent.Replace(MultiplierChar, "000000");
                }
                try
                {
                    if (!string.IsNullOrEmpty(textContent))
                    {
                        this.Value = Convert.ToDecimal(textContent);
                    }                       
                    
                }
                catch
                {
                    this.Value = 0m;
                }
            }
        }
    }