Silverlight AutoCompleteBox大写输入

本文关键字:输入 AutoCompleteBox Silverlight | 更新日期: 2023-09-27 18:02:24

我需要在Silverlight 4应用程序的AutoCompleteBox中强制使用大写输入。

在TextBox中,这可以通过替换KeyDown事件上的Text属性来完成,如:

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

然而,AutoCompleteBox不提供文本选择功能,我发现没有办法将插入符号移动到字符串结束

Silverlight AutoCompleteBox大写输入

你需要改变AutoCompleteBox模板,并在TextBox内添加UpperCaseBehavior:

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

其中UpperCaseBehavior是:

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();
    }
}

您可以使用绑定并立即将键入的值转换为大写。为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

这不是完美的,但它工作!对于焦点丢失事件,将文本用大写

<pre>
private void AutoCompleteTextBox_LostFocus(object sender, RoutedEventArgs e)
{
  var a = (AutoCompleteTextBox)sender;
  a.Text = a.Text.ToUpper();
}
</pre>

最后,我创建了一个只有大写字母的字体,并使用它

MSDN: AutoCompleteBox样式和模板

基本上就是在TextBox上使用样式设置器。character属性为:

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

这避免了在调整文本大小写时必须破解插入符号位置问题的麻烦。

当然,还有其他选项可以设置样式和Setter的位置和方式(我已经忘记了细节,但上面的内容似乎可以完成工作)

注意:我在WPF . net v4.0中使用此功能,使用AutoCompleteBox进行异步列表填充(控件不进行过滤)。