2016-08-28 2 views
2

私は、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が述べたように

+1

よくある間違いをしました。 ControlTemplateは、**別のTextBoxを含んではなりません**。 TextBoxを別のTextBox内にネストしました。チャイルドイベントとそれ以外のものは 'CustomTextBox'に接続されていません – lokusking

+0

@lokusking - ありがとう、私は' Control'を継承するように変更を加えましたが、今度は完全サークルになっています。新しいスレッドへのリンクで私のコメントを更新しました。これは、上で説明した問題とは完全に関連していないためです。 – Matt

答えて

2

は、それがTextBoxから継承されたあなたのCustomTextBoxいるので、あなたはControlTemplateTextBox styles and templatesようにカスタマイズする必要があります、ここに巣別TextBoxTextBoxに正しい方法ではありません。

TextBoxのデフォルトテンプレートをコピーしてCustomTextBoxと置き換えて試してみると、問題が解決します。また、テンプレートを自分で作成することもできます(例:Create Your First WinRT WatermarkTextBox Control)。しかしCustomTextBoxの中に別のTextBoxをネストしないでください。Why use a templated control over a UserControl?の答えを参照することができます。

他のプロパティを登録する場合は、DependencyPropertyを使用できます。新しいイベントを登録する場合は、Custom events and event accessors in Windows Runtime Componentsを参照してください。

+0

ありがとう、それはちょうど私が見る必要があったものです! – Matt

関連する問題