C# XAML自定义文本框光标停留在条目的开头
我正在为适用于Windows 8.1 Universal/UWP的XAML应用程序创建自定义控件,并不断发现一些细微差别。我似乎找不到任何关于创建现有控件(如TextBox)的自定义实现的优秀教程,因此我一直在查看Telerik等控件的源代码,以了解它们的自定义控件是如何工作的 我遇到的最新问题是,即使是最简单的自定义文本框,如果光标不停留在条目的开头,也无法创建。当我不断输入文本时,光标停留在开头,即使文本被追加到结尾。我通过在模拟器下面添加一个正常的文本框来验证它没有问题,该文本框功能正常。我确信这与我如何创建自定义控件有关 这是我的控制:C# XAML自定义文本框光标停留在条目的开头,c#,xaml,win-universal-app,uwp,uwp-xaml,C#,Xaml,Win Universal App,Uwp,Uwp Xaml,我正在为适用于Windows 8.1 Universal/UWP的XAML应用程序创建自定义控件,并不断发现一些细微差别。我似乎找不到任何关于创建现有控件(如TextBox)的自定义实现的优秀教程,因此我一直在查看Telerik等控件的源代码,以了解它们的自定义控件是如何工作的 我遇到的最新问题是,即使是最简单的自定义文本框,如果光标不停留在条目的开头,也无法创建。当我不断输入文本时,光标停留在开头,即使文本被追加到结尾。我通过在模拟器下面添加一个正常的文本框来验证它没有问题,该文本框功能正常。
public class CustomTextBox : TextBox
{
public CustomTextBox()
{
DefaultStyleKey = typeof(CustomTextBox);
}
}
下面是我的Generic.xaml文件及其模板,以说明该问题:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:customControls="using:CustomControls">
<Style TargetType="customControls:CustomTextBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="customControls:CustomTextBox">
<TextBox Text="{TemplateBinding Text}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
我还尝试订阅TextChanged事件,并根据新文本进行选择以尝试移动光标,但这两种方法都不起作用:
private void CustomTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
Select(Text.Length, 0);
}
更新
在更改为从控件继承之后,
我又回到了原来的问题。订阅TextChanged事件时,我无法获取要实时更新的Text属性。我支持这一点,因为它走的是一条与此不同的道路
旁注:我甚至试图从
TextBox
继承的原因是Telerik的RadTextBox控件就是这样实现的。正如@lokusking所提到的,在这里将TextBox
嵌套在另一个TextBox
中是不对的,因为您的自定义TextBox
继承自TextBox
,您需要自定义您的ControlTemplate
like
您可以复制TextBox
的默认模板,并替换为您的CustomTextBox
并尝试一下,它将解决您的问题。您还可以创建自己的模板,例如:。但是不要在自定义文本框
中嵌套另一个文本框
,您可以在这个线程中引用答案:,它很好地解释了我们使用模板控件的位置和原因
如果要注册其他属性,可以使用。如果要注册新事件,可以参考。您犯了一个常见错误。ControlTemplate不应包含其他文本框。您已将一个文本框嵌套在另一个文本框中。孩子们的事件和其他一切都没有连接到
CustomTextBox
@lokusking-谢谢,我已经做了一个更改,从控件继承了,但现在已经完全恢复了。我已经用一个新的帖子链接更新了我的评论,因为它与我上面描述的问题不完全相关。谢谢,这正是我需要看到的!
{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay, Path=Text}
private void CustomTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
Select(Text.Length, 0);
}