none
テキストボックス内の文字列の固定 RRS feed

  • 質問

  • visual studio 2015使用

    Outlookのメールアドレス入力欄(テキストボックス)において、入力されたメールアドレスが固定されているのを見ました。

    例えば
     [メールアドレス甲] ; hoge ; [メールアドレス乙]
    というように入力されていたとき、下記のような動きをします。

    ※以下、[甲]:[メールアドレス甲]

     ⇒[甲]の右側にキャレットがある時にバックスペースキーを押下すると[甲]ごと消える。
     ⇒[甲]の右側にキャレットがある時に左キーを押下するとキャレットが[甲]の左側に移動する
     ⇒[甲]をクリックすると[甲]が選択状態になる
     ⇒[甲]を右クリックするとコンテキストメニューが表示される。
     ⇒[甲]に下線が表示される。
     ⇒文字列「hoge」は上記の動きをしない。

    Visual Studio(またはWPF)を利用して再現するには、どのようなコードを書けばよいのでしょうか。

    2016年3月11日 1:25

回答

  • 以下を参考にすると実現できるかもしれません。

    Read-only Run elements in a WPF RichTextBox?
    http://stackoverflow.com/questions/1084495/read-only-run-elements-in-a-wpf-richtextbox


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク 指計算機 2016年3月12日 11:24
    2016年3月11日 2:38
    モデレータ
  • こんにちは。

    紹介されてるリンク先にも記載されてますが、
    RichTextBoxを使う方向にはなると思います。

    <Window x:Class="WpfApplication6.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication6"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <RichTextBox>
            <FlowDocument>
                <Paragraph>
                    <TextBlock TextDecorations="Underline" Text="メールアドレス甲;" />
                    <Run Text="hoge;" />
                    <TextBlock TextDecorations="Underline" Text="メールアドレス乙;" />
                </Paragraph>
            </FlowDocument>
        </RichTextBox>
    </Window>
    

    Outlookの場合であれば、メールアドレス欄からのロストフォーカス時にメールアドレスの検証等を行っているようですので
    同じようなタイミングで上記のようにParagraphの中身を変更することになるでしょうか。

    あとは右クリックはParagraphのContextMenuが開くと思いますので、
    HitTestなどで検証済みメールアドレスかどうかの判定などが必要かもしれません。

    • 回答としてマーク 指計算機 2016年3月12日 11:24
    2016年3月11日 18:38
    モデレータ

すべての返信

  • 以下を参考にすると実現できるかもしれません。

    Read-only Run elements in a WPF RichTextBox?
    http://stackoverflow.com/questions/1084495/read-only-run-elements-in-a-wpf-richtextbox


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク 指計算機 2016年3月12日 11:24
    2016年3月11日 2:38
    モデレータ
  • 返信ありがとうございます!
    英語でもググってみたのですが見つけることができませんでした・・・

    ざっくりとしか読めていませんが帰宅したら試してみます。

    2016年3月11日 2:46
  • こんにちは。

    紹介されてるリンク先にも記載されてますが、
    RichTextBoxを使う方向にはなると思います。

    <Window x:Class="WpfApplication6.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApplication6"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <RichTextBox>
            <FlowDocument>
                <Paragraph>
                    <TextBlock TextDecorations="Underline" Text="メールアドレス甲;" />
                    <Run Text="hoge;" />
                    <TextBlock TextDecorations="Underline" Text="メールアドレス乙;" />
                </Paragraph>
            </FlowDocument>
        </RichTextBox>
    </Window>
    

    Outlookの場合であれば、メールアドレス欄からのロストフォーカス時にメールアドレスの検証等を行っているようですので
    同じようなタイミングで上記のようにParagraphの中身を変更することになるでしょうか。

    あとは右クリックはParagraphのContextMenuが開くと思いますので、
    HitTestなどで検証済みメールアドレスかどうかの判定などが必要かもしれません。

    • 回答としてマーク 指計算機 2016年3月12日 11:24
    2016年3月11日 18:38
    モデレータ
  • ありがとうございます!
    やはりTextBlockがリッチテキストに入るってことがポイントみたいですね。

    バックスペースで削除ができる例を出していただきありがとうございます。

    実際の作業ではメールアドレスではなくもっと単純な文字に対してSpracheでの構文解析を絡めて
    実装をするつもりです。
    エンターキーをトリガーにしようかなとか考えています。

    最後に「TextBlock」で検索をかけて見つけたリンクを張っておきます。

    参考:文字列の一部を変更不可にしたい
    https://social.msdn.microsoft.com/Forums/ja-JP/4cef486a-bea1-47be-974c-2b7436aded15?forum=wpfja

    2016年3月12日 11:36