3

まず第一に、linq を使用してユーザー入力のテキスト ボックスを介して観察可能なコレクションをフィルター処理することについては多くの回答がありますが、コードの実行時については何もありませんが、英語で入力することはできません。

私のコードを説明するために、韓国語の名前と英語の名前を表す 2 つの文字列プロパティ KName と EName を持つ単純なクラス Person があります。これらの Person を保持するのは、persons という名前の ObservableCollection になります。

    class Person
    {
        public string KName { get; set; }
        public string EName { get; set; }
    }

    ObservableCollection<Person> persons;
    public MainPage()
    {
        this.InitializeComponent();
        persons = new ObservableCollection<Person>();

        Person s = new Person();
        s.KName = "홍길동";
        s.EName = "Hong Kil-dong";
        persons.Add(s);

        Person t = new Person();
        t.KName = "김지영";
        t.EName = "Kim Ji-young";
        persons.Add(t);

        Person u = new Person();
        u.KName = "최철수";
        u.EName = "Choi Chul-soo";
        persons.Add(u);

        this.DataContext = persons;
    }

xaml 側には、検索を処理するために Enter キーが押されたかどうかを確認する KeyDown イベント ハンドラーと、フィルターの結果を表示する ListView を含むテキスト ボックスがあります。

<Page
    x:Class="TextboxTest.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TextboxTest"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <TextBox x:Name="SearchTextBox" Height="70" Margin="15"
                 VerticalAlignment="Top"  KeyDown="SearchTextBox_Enter"/>
        <ListView x:Name="SearchResults" Margin="15" Height="500">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="5" HorizontalAlignment="Left">
                        <TextBlock Width="200" Text="{Binding Path=KName}"
                                   TextAlignment="Left" HorizontalAlignment="Left" />
                        <TextBlock Width="200" Text="{Binding Path= EName}" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Page>

および KeyDown ハンドラ

    private void SearchTextBox_Enter(object sender, KeyRoutedEventArgs e)
    {
        if (e.Key == Windows.System.VirtualKey.Enter)
        {
            string txt = SearchTextBox.Text;
            if(SearchResults.SelectedItem != null)
                SearchResults.SelectedItem = null;

            var filter = from Person in persons
                            let kname = Person.KName
                            let ename = Person.EName
                            where ename.Contains(txt) ||
                            kname.Contains(txt)
                            orderby kname
                            select Person;


            SearchResults.ItemsSource = filter;
        }
        e.Handled = true;
    }

だから私の問題は、韓国語で入力できるのに、テキストボックスに英語で入力できないことです。別の場所から英語のテキストをコピーしてテキスト ボックスに貼り付けると、期待どおりにフィルタリングされます。テキストボックスから KeyDown ハンドラーを削除すると、英語で正しく入力されます。したがって、問題は KeyDown ハンドラにあるはずです。誰かが私のコードに何か問題があると思いますか? または、これを行うためのより良い方法はありますか?

4

1 に答える 1

1

SearchBoxTextBox_Enter メソッドを修正する必要があります。

e.Handled = true;

次のように、IF 式の中に配置する必要があります。

if (e.Key == Windows.System.VirtualKey.Enter)
{
    // filtering...
    e.Handled = true;
}
于 2013-07-04T06:24:00.910 に答える