2014年7月31日木曜日

[WPF][Silverlight][C#]MVVM パターンで TextBox をフォーカス

FocusManager を使えばフォーカス設定できますが、TextBox の IsEnabled が false だったり、複数のFocusManager の設定があると、意図した動きをしてくれなくなります。

如何にすればシンプルに出来るか考えてみましたが、Behavior 使うのが一番シンプルに収まりそうです。フォーカス設定のみだと寂しいので、文字列全選択も書きました。



    public class TextBoxBehavior : Behavior<TextBox>
    {
        /// <summary>
        /// フォーカス設定
        /// </summary>
        public void Focus()
        {
            this.AssociatedObject.Focus();
        }

        /// <summary>
        /// 全選択
        /// </summary>
        public void SelectAll()
        {
            this.AssociatedObject.SelectAll();
        }
    }

後は、XAML側でボタンクリックされた時などに、CallMethodAction を書くだけでOKです。

<Window x:Class="Sample.TestWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
        xmlns:local="clr-namespace:Sample">
    <StackPanel>
        <Button Content="Button" HorizontalAlignment="Left" Width="75">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <ei:CallMethodAction TargetObject="{Binding ElementName=textBoxBehavior}" MethodName="Focus" />
                    <ei:CallMethodAction TargetObject="{Binding ElementName=textBoxBehavior}" MethodName="SelectAll" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>

        <TextBox HorizontalAlignment="Left" Height="23" Text="TextBox" Width="120">
            <i:Interaction.Behaviors>
                <local:TextBoxBehavior x:Name="textBoxBehavior" />
            </i:Interaction.Behaviors>
        </TextBox>
    </StackPanel>
</Window>





0 件のコメント:

コメントを投稿