2011-07-15 8 views
2

Silverlight 4アプリケーションでAutoCompleteBox内に大文字の入力を強制する必要があります。 AutoCompleteBoxは、テキスト選択機能を提供していない、と私は、文字列の末尾にキャレットを移動する方法を発見したしかしSilverlight AutoCompleteBox大文字入力

  control.Text += enteredChar; 
      control.Select(control.Text.Length, 0); //To maintain caret position 

:テキストボックスに

これは次のようにKeyDownイベントでTextプロパティを交換することによって行うことができます。

答えて

3

:UpperCaseBehaviorがどこにある

<TextBox x:Name="Text" ...> 
    <i:Interaction.Behaviors> 
     <behaviors:UpperCaseBehavior/> 
    </i:Interaction.Behaviors> 
</TextBox> 

public class UpperCaseBehavior: Behavior<TextBox> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.TextChanged += AssociatedObject_TextChanged; 
    } 

    private void AssociatedObject_TextChanged(object sender, TextChangedEventArgs args) 
    { 
     var selectionStart = AssociatedObject.SelectionStart; 
     var selectionLength = AssociatedObject.SelectionLength; 

     AssociatedObject.Text = AssociatedObject.Text.ToUpper(); 

     AssociatedObject.SelectionStart = selectionStart; 
     AssociatedObject.SelectionLength = selectionLength; 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.TextChanged -= AssociatedObject_TextChanged; 
     base.OnDetaching(); 
    } 
} 
+0

これはうまくいきますが、テキストカーソル位置の変更によるフィルタリングのバグがあり、開発者の一人がこのパスを試していて、小さなバグがありました。私はexectlyは思い出せませんが、オートコンプリートリストテキストは発火しないイベントがあるため、リスト項目と完全に一致します。 –

2

バインディングを使用して、型付きの値をすぐに大文字に変換できます。 textchangedイベントを持つカスタムスタイルを追加します。私はこれをテストしたので、必要な場合は、それを動作させることができなければサンプルを送ることができます。

XAML:

<Style x:Key="AutoCompleteBoxStyle1" TargetType="sdk:AutoCompleteBox"> 
       <Setter Property="IsTabStop" Value="False"/> 
       <Setter Property="Padding" Value="2"/> 
       <Setter Property="BorderThickness" Value="1"/> 
       <Setter Property="BorderBrush"> 
        <Setter.Value> 
         <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
          <GradientStop Color="#FFA3AEB9" Offset="0"/> 
          <GradientStop Color="#FF8399A9" Offset="0.375"/> 
          <GradientStop Color="#FF718597" Offset="0.375"/> 
          <GradientStop Color="#FF617584" Offset="1"/> 
         </LinearGradientBrush> 
        </Setter.Value> 
       </Setter> 
       <Setter Property="Background" Value="#FFFFFFFF"/> 
       <Setter Property="Foreground" Value="#FF000000"/> 
       <Setter Property="MinWidth" Value="45"/> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="sdk:AutoCompleteBox"> 
          <Grid Opacity="{TemplateBinding Opacity}"> 
           <VisualStateManager.VisualStateGroups> 
            <VisualStateGroup x:Name="PopupStates"> 
             <VisualStateGroup.Transitions> 
              <VisualTransition GeneratedDuration="0:0:0.1" To="PopupOpened"/> 
              <VisualTransition GeneratedDuration="0:0:0.2" To="PopupClosed"/> 
             </VisualStateGroup.Transitions> 
             <VisualState x:Name="PopupOpened"> 
              <Storyboard> 
               <DoubleAnimation To="1.0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="PopupBorder"/> 
              </Storyboard> 
             </VisualState> 
             <VisualState x:Name="PopupClosed"> 
              <Storyboard> 
               <DoubleAnimation To="0.0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="PopupBorder"/> 
              </Storyboard> 
             </VisualState> 
            </VisualStateGroup> 
            <VisualStateGroup x:Name="ValidationStates"> 
             <VisualState x:Name="Valid"/> 
             <VisualState x:Name="InvalidUnfocused"> 
              <Storyboard> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement"> 
                <DiscreteObjectKeyFrame KeyTime="0"> 
                 <DiscreteObjectKeyFrame.Value> 
                  <Visibility>Visible</Visibility> 
                 </DiscreteObjectKeyFrame.Value> 
                </DiscreteObjectKeyFrame> 
               </ObjectAnimationUsingKeyFrames> 
              </Storyboard> 
             </VisualState> 
             <VisualState x:Name="InvalidFocused"> 
              <Storyboard> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement"> 
                <DiscreteObjectKeyFrame KeyTime="0"> 
                 <DiscreteObjectKeyFrame.Value> 
                  <Visibility>Visible</Visibility> 
                 </DiscreteObjectKeyFrame.Value> 
                </DiscreteObjectKeyFrame> 
               </ObjectAnimationUsingKeyFrames> 
               <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" Storyboard.TargetName="validationTooltip"> 
                <DiscreteObjectKeyFrame KeyTime="0"> 
                 <DiscreteObjectKeyFrame.Value> 
                  <System:Boolean>True</System:Boolean> 
                 </DiscreteObjectKeyFrame.Value> 
                </DiscreteObjectKeyFrame> 
               </ObjectAnimationUsingKeyFrames> 
              </Storyboard> 
             </VisualState> 
            </VisualStateGroup> 
           </VisualStateManager.VisualStateGroups> 
           <TextBox x:Name="Text" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" IsTabStop="True" Margin="0" Padding="{TemplateBinding Padding}" Style="{TemplateBinding TextBoxStyle}" SelectionChanged="Text_SelectionChanged"/> 
           <Border x:Name="ValidationErrorElement" BorderBrush="#FFDB000C" BorderThickness="1" CornerRadius="1" Visibility="Collapsed"> 
            <ToolTipService.ToolTip> 
             <ToolTip x:Name="validationTooltip" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Template="{StaticResource CommonValidationToolTipTemplate}"> 
              <ToolTip.Triggers> 
               <EventTrigger RoutedEvent="Canvas.Loaded"> 
                <BeginStoryboard> 
                 <Storyboard> 
                  <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsHitTestVisible" Storyboard.TargetName="validationTooltip"> 
                   <DiscreteObjectKeyFrame KeyTime="0"> 
                    <DiscreteObjectKeyFrame.Value> 
                     <System:Boolean>true</System:Boolean> 
                    </DiscreteObjectKeyFrame.Value> 
                   </DiscreteObjectKeyFrame> 
                  </ObjectAnimationUsingKeyFrames> 
                 </Storyboard> 
                </BeginStoryboard> 
               </EventTrigger> 
              </ToolTip.Triggers> 
             </ToolTip> 
            </ToolTipService.ToolTip> 
            <Grid Background="Transparent" HorizontalAlignment="Right" Height="12" Margin="1,-4,-4,0" VerticalAlignment="Top" Width="12"> 
             <Path Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z" Fill="#FFDC000C" Margin="1,3,0,0"/> 
             <Path Data="M 0,0 L2,0 L 8,6 L8,8" Fill="#ffffff" Margin="1,3,0,0"/> 
            </Grid> 
           </Border> 
           <Popup x:Name="Popup"> 
            <Grid Opacity="{TemplateBinding Opacity}"> 
             <Border x:Name="PopupBorder" BorderThickness="0" Background="#11000000" HorizontalAlignment="Stretch" Opacity="0"> 
              <Border.RenderTransform> 
               <TranslateTransform X="1" Y="1"/> 
              </Border.RenderTransform> 
              <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="0" HorizontalAlignment="Stretch" Opacity="1.0" Padding="0"> 
               <Border.Background> 
                <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
                 <GradientStop Color="#FFDDDDDD" Offset="0"/> 
                 <GradientStop Color="#AADDDDDD" Offset="1"/> 
                </LinearGradientBrush> 
               </Border.Background> 
               <Border.RenderTransform> 
                <TransformGroup> 
                 <TranslateTransform X="-1" Y="-1"/> 
                </TransformGroup> 
               </Border.RenderTransform> 
               <ListBox x:Name="Selector" BorderThickness="0" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" ScrollViewer.HorizontalScrollBarVisibility="Auto" ItemTemplate="{TemplateBinding ItemTemplate}" ItemContainerStyle="{TemplateBinding ItemContainerStyle}" ScrollViewer.VerticalScrollBarVisibility="Auto"/> 
              </Border> 
             </Border> 
            </Grid> 
           </Popup> 
          </Grid> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 

あなたAutoCompleteBoxを追加して、以前のスタイル参照:

<sdk:AutoCompleteBox Width="169" x:Name="txtSearchBox" Text="{Binding TypedText, Mode=TwoWay}" Style="{StaticResource AutoCompleteBoxStyle1}" /> 

コードの後ろ:

バインド入力したテキスト:

がリソースを追加

private string _typedText; 
public string TypedText 
{ 
    get { return _typedText; } 
    set 
    { 
     _typedText = value.ToUpper(); 
     NotifyPropertyChanged("TypedText"); 
    } 
} 

TextSelectionイベント:

private void Text_SelectionChanged(object sender, System.Windows.RoutedEventArgs e) 
     { 
      TextBox tb = sender as TextBox; 
      if (tb != null && !String.IsNullOrEmpty(TypedText) && tb.SelectionStart != TypedText.Length) 
      { 
       tb.SelectionStart = TypedText.Length; 
       tb.SelectionLength = 0; 
      } 
     } 

HTH

+0

私はこれを試しますが、基本的にAutoCompeleteが折り返す内部TextBoxへの参照を取得しますが、その選択機能を混乱させることは良いことです、それは自分のautocompeleteがselectonを追加するのを妨げるので、私はこれを試していただきありがとうございます。 –

+0

それがアレックスになったら教えてください。 – emp

0

私は唯一の資本lattersでフォントを作成し、それを使用して、終わりました。

1

完璧ではありませんが、機能します!失われたフォーカスイベントに大文字にテキストを入れ

あなたはAutoCompleteBoxテンプレートを変更し、内のTextBoxにUpperCaseBehaviorを追加する必要が
<pre> 
private void AutoCompleteTextBox_LostFocus(object sender, RoutedEventArgs e) 
{ 
    var a = (AutoCompleteTextBox)sender; 
    a.Text = a.Text.ToUpper(); 
} 
</pre> 
0

MSDN: AutoCompleteBox Styles and Templates

基本的にスタイルセッターを使用してください としてTextBox.CharacterCasingプロパティは、以下:

<my:AutoCompleteBox x:Name="autoCompleteBox1"> 
     <my:AutoCompleteBox.TextBoxStyle> 
      <Style TargetType="TextBox"> 
       <Setter Property="CharacterCasing" Value="Upper" /> 
      </Style> 
     </my:AutoCompleteBox.TextBoxStyle> 
    </my:AutoCompleteBox> 

これは、テキストの大文字と小文字を調整するときにキャレット位置の問題に対する解決策をハッキングすることの煩わしさを回避します。

どこでどのようにセットアップスタイルやコースのセッターをするための他のオプションがあります(私は、インとアウトを忘れてしまったが、上記の仕事を得るように見えた)

NBを:私はこれを使用していますWPF .Net v4.0では、非同期リストを作成するAutoCompleteBoxがあります(フィルタリングはコントロールによって行われません)。

関連する問題