私は、Windows 8.1 Universal/UWP用のXAMLアプリケーションのカスタムコントロールを作成しており、微妙なニュアンスを見つけ出しています。既存のコントロール(TextBoxなど)のカスタム実装を作成する上で参考になるチュートリアルはありません。Telerikのようなコントロールのソースコードを見て、カスタムコントロールの仕組みを理解しようとしています。XAMLカスタムテキストボックスカーソルがエントリの開始時に残ります
私が直面している最新の問題は、エントリの先頭にカーソルを置かずに、最もシンプルなカスタムTextBoxを作成することができないということです。テキストを入力し続けると、テキストが最後に追加されても、カーソルは先頭にとどまります。エミュレータの問題ではないことを確認しました。正常に機能する通常のテキストボックスをその下に追加します。これはカスタムコントロールの作成方法と関係があると確信しています。
ここに私のコントロールです:
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です最初のテキストボックスにテキストを入力します。
:私は双方向バインディングを使用するように結合変更しようとした<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>
:TextBlockのは、それはここに私を導いた私の元の問題に重要である私の入力したテキストにリアルタイムで変化を示すことがあります
{Binding RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay, Path=Text}
Iまた、TextChangedイベントをサブスクライブして試してみて、カーソルを移動するための新しいテキストの結果として選択をして試してみたが、それらのどちらも働いている:
private void CustomTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
Select(Text.Length, 0);
}
更新
Control,
から継承するように変更した後、元の問題に完全に戻ってきました。 TextChangedイベントを購読すると、リアルタイムで更新するTextプロパティを取得できません。私はa created a new threadのために、これとは違った経路をたどるためです。
サイドノート:私がTextBox
から継承しようとする理由も、TelerikのRadTextBoxコントロールが実装された理由です。 @lokuskingが述べたように
よくある間違いをしました。 ControlTemplateは、**別のTextBoxを含んではなりません**。 TextBoxを別のTextBox内にネストしました。チャイルドイベントとそれ以外のものは 'CustomTextBox'に接続されていません – lokusking
@lokusking - ありがとう、私は' Control'を継承するように変更を加えましたが、今度は完全サークルになっています。新しいスレッドへのリンクで私のコメントを更新しました。これは、上で説明した問題とは完全に関連していないためです。 – Matt