2009-07-27 5 views
13

私はこのTextBoxを持っています。このテキストボックスは、のDataTemplateに位置しています:wpf:IsReadOnly = trueでTextBoxのテキストを選択していますか?

<DataTemplate x:Key="myTemplate"> 
    <TextBox Text="{Binding Path=FullValue, Mode=TwoWay}" IsEnabled="False" /> 
     ... 

と私は(必要に応じてテキストボックスをクリックすることにより)ユーザが内部のテキスト全体を選択できるようにしたいです。そして私は コードを使用したくないです。

どうすればよいですか?前もって感謝します。

+0

私は 'SelectAll()'を使っていましたが、コンテンツを右クリックしてコピーすることができます。 – EricG

答えて

18

IsEnabledの代わりにIsReadOnlyプロパティを使用すると、ユーザーはテキストを選択できます。また、編集しない場合は、OneWayバインディングで十分です。

XAMLのアイデアは、コードビハインドを完全に置き換えるものではありません。最も重要なことは、ビジネスロジックではなくコードビハインドにUI固有のコードだけを置こうとすることです。つまり、すべてのテキストを選択するのはUI固有であり、コードビハインドでは傷つけません。そのためにmyTextBox.SelectAll()を使用してください。

+0

問題は、この問題はDataTemplateにあることです。そして私が知っていることイベントは、DataTemplatesで使用することはできません。 –

+0

さらに、私はMVVMを使用しようとしています。コード内にUI固有のコードを持つことはOKですか?たとえば、私のボタンにはOnclickイベントハンドラはありませんが、MVVMのICommandに直接バインドされています。 –

+0

UI固有のものであれば、それをコードの中に入れても構いません。 MVVMではほとんど必要ありませんが、それはあなたがそれを必要としないことを意味しません。また、データ・テンプレートから生成されたコントロールを取得する手段もあります。たとえば、ItemsControl(ListBoxなど)がある場合は、listBox.ItemContainerGenerator.ContainerFromItem(listBox.SelectedItem);を使用できます。 – Botz3000

6

ReadEnabledを削除し、TextBoxをReadOnlyとして設定すると、テキストを選択できますがユーザーの入力を停止できます。

IsReadOnly="True" 

この方法の唯一の問題は、それはまだ「有効」になりますテキストボックスを入力することはできませんが、ということです。

ラウンドを取得するには(必要な場合)、テキストを明るくするためのスタイルを追加し、背景を暗くして無効にします。

無効にした外観と有効な外観の間でテキストボックスをフリックするスタイルで、次の例を追加しました。

<Window x:Class="WpfApplication1.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}"> 

     <Style.Triggers> 
      <Trigger Property="IsReadOnly" Value="True"> 
       <Setter Property="Background" Value="LightGray" /> 
      </Trigger> 
      <Trigger Property="IsReadOnly" Value="True"> 
       <Setter Property="Foreground" Value="DarkGray" /> 
      </Trigger> 
      <Trigger Property="IsReadOnly" Value="False"> 
       <Setter Property="Background" Value="White" /> 
      </Trigger> 
      <Trigger Property="IsReadOnly" Value="False"> 
       <Setter Property="Foreground" Value="Black" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<Grid> 
    <TextBox Height="23" Margin="25,22,133,0" IsReadOnly="True" Text="monkey" Name="textBox1" VerticalAlignment="Top" /> 
    <Button Height="23" Margin="25,51,133,0" Name="button1" VerticalAlignment="Top" Click="button1_Click">Button</Button> 
</Grid> 

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     textBox1.IsReadOnly = !textBox1.IsReadOnly; 
    } 
4

一つ、私はちょうど発見ノート(明らかにこれは古い質問ですが、これが誰かを助けるかもしれない):

IsHitTestVisible=Falseは、選択(したがって、コピー)した場合も無効になります。

0

少し変形例 -

By adding <Window.Resources> after <Window> and before <Grid> will make your text box behave like normal winforms textbox. 


<Window x:Class="..." Height="330" Width="600" Loaded="Window_Loaded" WindowStartupLocation="CenterOwner"> 

<Window.Resources> 
    <Style TargetType="{x:Type TextBox}"> 
     <Style.Triggers> 
      <Trigger Property="IsReadOnly" Value="True"> 
       <Setter Property="Background" Value="LightGray" /> 
      </Trigger> 
      <Trigger Property="IsReadOnly" Value="False"> 
       <Setter Property="Background" Value="White" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 

<Grid> 

(独自の新しいスタイルを発明していない)のWinFormsのスタイルに合わせて、そしてもちろん、あなたのテキストボックスにIsReadOnlyの=「true」属性が設定されている必要があります。

関連する問題