C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: WPF テキストを全選択状態にしたい


(過去ログ 65 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■37468 / inTopicNo.1)  WPF テキストを全選択状態にしたい
  
□投稿者/ 倉田 有大 (656回)-(2009/06/23(Tue) 13:35:50)

分類:[.NET 全般] 

こんにちは、倉田 有大です。
フォーカスがあたったテキストボックスを、全選択状態にしたいのです。

<Window x:Class="TextBoxSelect2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <Style TargetType="{x:Type TextBox}">
            <EventSetter Event="GotFocus" Handler="TextAllSelect" />
        </Style>
    </Window.Resources>
    <Grid>
        <TextBox Height="24" Margin="10,91,0,0" Name="textBox1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="120" />
        <TextBox Height="24" HorizontalAlignment="Right" Margin="0,91,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" />
    </Grid>
</Window>


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace TextBoxSelect2
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {            
            InitializeComponent();
        }

        public void TextAllSelect(object o, RoutedEventArgs e)
        {
            TextBox textBox = e.OriginalSource as TextBox;

            if (textBox == null)
                return;
            textBox.SelectAll();
        }
    }
}

上記ですと、TABでのフォーカス移動なら全選択になるのですが、マウスでテキストボックスをクリックすると、全選択された後すぐに解除されてしまいます。

引用返信 編集キー/
■37485 / inTopicNo.2)  Re[1]: WPF テキストを全選択状態にしたい
□投稿者/ かずき (37回)-(2009/06/23(Tue) 22:00:51)
かずき さんの Web サイト
イベントの中身を↓のようにしてみたらうまく動きました。
TextBox textBox = e.OriginalSource as TextBox;

if (textBox == null)
    return;

Action action = textBox.SelectAll;
Dispatcher.BeginInvoke(action);

割とよく使ってる手なんですけど、これがお作法的に正しいのかは謎です…。

引用返信 編集キー/
■37487 / inTopicNo.3)  Re[2]: WPF テキストを全選択状態にしたい
□投稿者/ 倉田 有大 (658回)-(2009/06/23(Tue) 22:15:59)
> Action action = textBox.SelectAll;
> Dispatcher.BeginInvoke(action);
>
> 割とよく使ってる手なんですけど、これがお作法的に正しいのかは謎です…。

ありがとうございます_(__)_無事、動作しました。
BeginInvokeで、後からSelectAllを動作させるという考え方なのかな。
これは、ブログにのせとこうかな。結構この動作を期待している人多いいのではないでしょうか。

今日という日がこれだけに費やされましたー。いやー、XAML、WPFは今からこつこつ勉強していたほうがいいですね。
今やっとかないと、いざというときにぜんぜん使えそうにないです。
解決済み
引用返信 編集キー/
■37490 / inTopicNo.4)  Re[3]: WPF テキストを全選択状態にしたい
□投稿者/ 倉田 有大 (659回)-(2009/06/23(Tue) 23:15:11)
あれ、何度か試してみましたが、微妙に動作が怪しいときがありますね。
たいてい動いてくれるのですが。

さらにリストビューの中のテキストボックスだと、挙動がさらに変です。


引用返信 編集キー/
■37509 / inTopicNo.5)  Re[4]: WPF テキストを全選択状態にしたい
□投稿者/ かずき (38回)-(2009/06/24(Wed) 10:55:42)
諸々のタイミングによっては微妙な動きをするかもな〜と
思ってたのですが、やっぱりあやしいですか^^;

なんかうまい方法ないですかねぇ…
引用返信 編集キー/
■37529 / inTopicNo.6)  Re[5]: WPF テキストを全選択状態にしたい
□投稿者/ 倉田 有大 (660回)-(2009/06/24(Wed) 16:00:03)
2009/06/24(Wed) 16:02:28 編集(投稿者)
> なんかうまい方法ないですかねぇ…

まだ完全じゃありませんが。

<Window x:Class="TextBoxSelect2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <Style TargetType="{x:Type TextBox}">
            <EventSetter Event="GotFocus" Handler="TextAllSelectGotFocus" />
            <EventSetter Event="PreviewMouseDown" Handler="TextAllSelectMouseDown" />
        </Style>
    </Window.Resources>
    <Grid>
        <TextBox  Height="24" Margin="10,91,0,0" Name="textBox1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="122" />
        <TextBox  Height="24" HorizontalAlignment="Right" Margin="0,91,0,0" Name="textBox2" VerticalAlignment="Top" Width="133" />
    </Grid>
</Window>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace TextBoxSelect2
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
           
            InitializeComponent();
        }

        //tabで移動用
        public void TextAllSelectGotFocus(object o, RoutedEventArgs e)
        {
            TextBox textBox = e.Source as TextBox;

            if (textBox == null)
                return;
            
            textBox.SelectAll();
        }

        public void TextAllSelectMouseDown(object o, RoutedEventArgs e)
        {
            TextBox textBox = e.Source as TextBox;

            if (textBox == null)
                return;

            textBox.SelectAll();
            textBox.Focus();
            e.Handled = true;
        }
    }
}

これなら、クリックに失敗しないみたいです。
ただ、何回クリックしても、全選択状態になってしまうんですよね。
ユーザーが望んでいるのはフォーカスが動いた後の最初のクリック時に全選択でしょうから。

引用返信 編集キー/
■37535 / inTopicNo.7)  Re[6]: WPF テキストを全選択状態にしたい
□投稿者/ 倉田 有大 (661回)-(2009/06/24(Wed) 16:34:02)
2009/06/24(Wed) 18:20:54 編集(投稿者)
<Window x:Class="TextBoxSelect2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <Style TargetType="{x:Type TextBox}">
            <EventSetter Event="GotFocus" Handler="TextAllSelectGotFocus" />
            <EventSetter Event="PreviewMouseDown" Handler="TextAllSelectMouseDown" />
        </Style>
    </Window.Resources>
    <Grid>
        <TextBox  Height="24" Margin="10,91,0,0" Name="textBox1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="122" />
        <TextBox  Height="24" HorizontalAlignment="Right" Margin="0,91,0,0" Name="textBox2" VerticalAlignment="Top" Width="133" />
    </Grid>
</Window>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace TextBoxSelect2
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class Window1 : Window
    {
        private TextBox beforSelectTextBox = null;
        public Window1()
        {
            InitializeComponent();
        }

        //tabで移動用
        public void TextAllSelectGotFocus(object o, RoutedEventArgs e)
        {
            TextBox textBox = e.Source as TextBox;

            if (textBox == null)
                return;

            textBox.SelectAll();
            beforSelectTextBox = textBox;
        }

        public void TextAllSelectMouseDown(object o, RoutedEventArgs e)
        {
            TextBox textBox = e.Source as TextBox;

            if (textBox == null)
                return;

            if (beforSelectTextBox == null || (beforSelectTextBox != null && beforSelectTextBox != textBox))
            {
                textBox.SelectAll();
                textBox.Focus();
                e.Handled = true;
            }
        }
    }
}

こ、これでどうだ。

引用返信 編集キー/
■37688 / inTopicNo.8)  Re[7]: WPF テキストを全選択状態にしたい
□投稿者/ 倉田 有大 (668回)-(2009/06/26(Fri) 23:29:41)
2009/06/27(Sat) 01:04:26 編集(投稿者)
  public class AllSelectTextBehavior
    {
        public static bool GetIsEnabled(ListView view)
        {
            return (bool)view.GetValue(IsEnabledProperty);
        }

        public static void SetIsEnabled(ListView view, bool value)
        {
            view.SetValue(IsEnabledProperty, value);
        }

        public static readonly DependencyProperty IsEnabledProperty =
            DependencyProperty.RegisterAttached(
                "IsEnabled", typeof(bool), typeof(AllSelectTextBehavior),
                new UIPropertyMetadata(false, OnIsEnabledChanged));

        static void OnIsEnabledChanged(DependencyObject depObj,
                                   DependencyPropertyChangedEventArgs e)
        {
            var textBox = depObj as TextBox;

            if (textBox == null)
            {
                return;
            }

            if (e.NewValue is bool == false)
            {
                return;
            }

            bool isEnabled = (bool)e.NewValue;

            if (isEnabled)
            {
                textBox.PreviewMouseLeftButtonDown += OnSelectMouseDown;
                textBox.GotFocus += GotFocus;
                textBox.LostFocus += LostFocus;
                
            }
            else
            {
                textBox.PreviewMouseLeftButtonDown -= OnSelectMouseDown;
                textBox.GotFocus -= GotFocus;
                textBox.LostFocus -= LostFocus;
            }
        }

        static public void GotFocus(object o, RoutedEventArgs e)
        {
            TextBox textBox = o as TextBox;

            if (textBox == null)
                return;

            
            textBox.SelectAll();
            textBox.Tag = true;
            
        }

        static public void LostFocus(object o, RoutedEventArgs e)
        {
            TextBox textBox = o as System.Windows.Controls.TextBox;

            textBox.Tag = false;
        }

        static public void OnSelectMouseDown(object o, RoutedEventArgs e)
        {
            TextBox textBox = o as System.Windows.Controls.TextBox;

            if (textBox == null)
                return;

            if (textBox.Tag == null || (bool)textBox.Tag == false)
            {
                textBox.SelectAll();
                textBox.Focus();
                e.Handled = true;
                textBox.Tag = true;
            }
        }

Behaviorバージョンです。
ただしかし、マウスのクリックでDoDragを実装しているとけんかして、期待通りの動作をしてくれません。


ぬーん、ちょっときもちわるいー

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -