3

カーソルがテキストボックスにフォーカスしているときにタッチスクリーンキーボードを開く必要があるタッチスクリーンアプリケーションに取り組んでいます。次のコードを使用して、ビューモデルにあるコマンドを呼び出しています。

 <i:Interaction.Triggers>
   <i:EventTrigger EventName="GotFocus">
     <i:InvokeCommandAction Command="{Binding openKeyboard}" />
   </i:EventTrigger>
 </i:Interaction.Triggers>

各テキストボックスに書き込むと正常に機能します...単一のフォームに複数のテキストボックスを作成します。一般的に書き込む方法はありますか?フォーム(または)アプリケーションのすべてのテキストボックスに適用する必要がありますか?

前もって感謝します

4

2 に答える 2

2

添付の動作を使用するのが好きです。これは、フォーカスを取得したときにテキストボックスの値を選択するために持っている例です。このようにして、この動作を任意のテキストボックスに適用できます。アタッチされたビヘイビアーの優れた点の1つは、多くのプロパティ/イベントがUIElementレベルにあるため、複数のコントロール間で一部のビヘイビアーを再利用できることです。とにかく、ここに私の例があります:

行動

 public class SelectAllOnFocusedBehavior
{

    private static bool GetSelectAllOnFocused(TextBox textBox)
    {
        return (bool) textBox.GetValue(SelectAllOnFocusedProperty);
    }

    public static void SetSelectAllOnFocused(
        TextBox textBox, bool value)
    {
        textBox.SetValue(SelectAllOnFocusedProperty, value);
    }


    public static readonly DependencyProperty SelectAllOnFocusedProperty =
        DependencyProperty.RegisterAttached(
            "SelectAllOnFocused",
            typeof (bool),
            typeof (SelectAllOnFocusedBehavior),
            new UIPropertyMetadata(false, OnSelectAllOnFocusedChanged));

    private static void OnSelectAllOnFocusedChanged(
        DependencyObject depObj, DependencyPropertyChangedEventArgs e)
    {
        TextBox item = depObj as TextBox;
        if (item == null)
            return;
        if (e.NewValue is bool == false)
            return;

        if ((bool) e.NewValue)
        {
            item.PreviewMouseLeftButtonDown += item_IgnoreLeftMouseDown;
            item.GotFocus+=item_GotFocus;
        }
        else
        {
            //remove EventsHere
            item.PreviewMouseLeftButtonDown -= item_IgnoreLeftMouseDown;
            item.GotFocus -= item_GotFocus;
        }


    }

    static void item_IgnoreLeftMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        // Find the TextBox
        DependencyObject parent = e.OriginalSource as UIElement;
        while (parent != null && !(parent is TextBox))
            parent = VisualTreeHelper.GetParent(parent);

        if (parent != null)
        {
            var textBox = (TextBox)parent;
            if (!textBox.IsKeyboardFocusWithin)
            {
                // If the text box is not yet focussed, give it the focus and
                // stop further processing of this click event.
                textBox.Focus();
                e.Handled = true;
            }
        }
    }

    static void  item_GotFocus(object sender, RoutedEventArgs e)
    {
         var item = e.OriginalSource as TextBox;
         if (item != null)
            item.SelectAll();
    }


    //EventHandler Here

}

対応するwpf

 <TextBox x:Name="blahblah"  
                                 cmds:SelectAllOnFocusedBehavior.SelectAllOnFocused="True"
                                 cmds:NextTabItemOnEnterBehavior.NextTabItemOnEnter="True"
                                 Height="20" Width="75" 
于 2013-02-26T19:52:13.153 に答える
0

Caliburnを使用している場合は、次の操作を実行して、ViewModelで何かをトリガーできます。

<i:Interaction.Triggers>
    <i:EventTrigger EventName="GotFocus">
        <cal:ActionMessage MethodName="openKeyboard" />
    </i:EventTrigger>
</i:Interaction.Triggers>

次に、ViewModelにMethodNameと同じ名前のメソッドを作成します。

public void openKeyboard()
{
    // Do your stuff
}

お役に立てば幸いです。

于 2019-10-31T09:47:43.123 に答える