XAML 自定义文本框光标停留在条目开始处
XAML Custom Textbox Cursor Stays at Start of Entry
我正在为 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>
最后,我的页面 XAML 显示了当您 运行 并在第一个文本框中输入文本时出现的问题。 TextBlock 用于显示我输入的文本的实时更改,这对导致我出现在这里的原始问题至关重要:
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="{Binding ElementName=txtTextBox, Path=Text}" Grid.Row="0" VerticalAlignment="Bottom" />
<local:CustomTextBox Grid.Row="1" x:Name="txtTextBox" />
<TextBox Grid.Row="2"></TextBox>
</Grid>
我已经尝试更改绑定以使用双向绑定:
{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay, Path=Text}
我也尝试过订阅 TextChanged 事件并执行 Select 作为新文本的结果来尝试移动光标,但这些都没有用:
private void CustomTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
Select(Text.Length, 0);
}
更新
更改为从 Control,
继承后,我又回到了原来的问题。订阅 TextChanged 事件时,我无法让 Text 属性 实时更新。我 a created a new thread 因为它走的路与这不同。
旁注:我什至试图从 TextBox
继承的原因是因为这就是 Telerik 的 RadTextBox 控件的实现方式。
正如@lokusking 提到的,将 TextBox
嵌套在另一个 TextBox
中是不正确的方法,因为您的 CustomTextBox
继承自 TextBox
,您将需要自定义您的 ControlTemplate
,例如 TextBox styles and templates。
您可以复制TextBox
的默认模板,替换成您的CustomTextBox
试试看,它会解决您的问题。您也可以创建自己的模板,例如:Create Your First WinRT WatermarkTextBox Control. But don't nest another TextBox
within your CustomTextBox
, you can refer the answer in this thread: ,它很好地解释了我们在何处以及为何使用模板化控件。
如果要注册其他属性,可以使用DependencyProperty, and if you want to register new Events, you can refer to Custom events and event accessors in Windows Runtime Components。
我正在为 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>
最后,我的页面 XAML 显示了当您 运行 并在第一个文本框中输入文本时出现的问题。 TextBlock 用于显示我输入的文本的实时更改,这对导致我出现在这里的原始问题至关重要:
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="{Binding ElementName=txtTextBox, Path=Text}" Grid.Row="0" VerticalAlignment="Bottom" />
<local:CustomTextBox Grid.Row="1" x:Name="txtTextBox" />
<TextBox Grid.Row="2"></TextBox>
</Grid>
我已经尝试更改绑定以使用双向绑定:
{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay, Path=Text}
我也尝试过订阅 TextChanged 事件并执行 Select 作为新文本的结果来尝试移动光标,但这些都没有用:
private void CustomTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
Select(Text.Length, 0);
}
更新
更改为从 Control,
继承后,我又回到了原来的问题。订阅 TextChanged 事件时,我无法让 Text 属性 实时更新。我 a created a new thread 因为它走的路与这不同。
旁注:我什至试图从 TextBox
继承的原因是因为这就是 Telerik 的 RadTextBox 控件的实现方式。
正如@lokusking 提到的,将 TextBox
嵌套在另一个 TextBox
中是不正确的方法,因为您的 CustomTextBox
继承自 TextBox
,您将需要自定义您的 ControlTemplate
,例如 TextBox styles and templates。
您可以复制TextBox
的默认模板,替换成您的CustomTextBox
试试看,它会解决您的问题。您也可以创建自己的模板,例如:Create Your First WinRT WatermarkTextBox Control. But don't nest another TextBox
within your CustomTextBox
, you can refer the answer in this thread:
如果要注册其他属性,可以使用DependencyProperty, and if you want to register new Events, you can refer to Custom events and event accessors in Windows Runtime Components。