2009-07-27 36 views
13

Tôi có Hộp văn bản này. TextBox này nằm ở DataTemplate:wpf: Chọn văn bản trong TextBox với IsReadOnly = true?

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

và tôi muốn cho phép người dùng để chọn toàn bộ văn bản bên trong nó (tùy chọn bằng cách nhấp vào Textbox). Và tôi không muốn sử dụng bất kỳ mã số nào phía sau.

Làm cách nào để thực hiện điều đó? Cảm ơn trước.

+0

Tôi đã sử dụng 'SelectAll()' và sau đó nó cho phép bạn nhấp chuột phải và sao chép nội dung. – EricG

Trả lời

18

Sử dụng thuộc tính IsReadOnly thay vì IsEnabled cho phép người dùng chọn văn bản. Ngoài ra, nếu nó không nên được chỉnh sửa, một ràng buộc OneWay là đủ.

Ý tưởng XAML không thay thế hoàn toàn mã-đằng sau. Điều quan trọng nhất là bạn cố gắng chỉ có mã giao diện người dùng cụ thể trong mã sau, không phải logic nghiệp vụ. Điều đó đang được nói, việc chọn tất cả văn bản là giao diện người dùng cụ thể và không bị tổn thương ở mã sau. Sử dụng myTextBox.SelectAll() cho điều đó.

+0

Vấn đề là cái này nằm trong DataTemplate. Và những gì tôi biết Sự kiện không thể được sử dụng trong DataTemplates. –

+0

Còn gì nữa, tôi đang cố gắng sử dụng MVVM. Có OK để có mã giao diện người dùng cụ thể trong mã không? Ví dụ, các nút của tôi không có trình xử lý sự kiện Onclick, nhưng chúng được liên kết trực tiếp với ICommand trong MVVM. –

+0

Nếu chỉ có giao diện người dùng cụ thể, bạn có thể đặt mã đó vào mã phía sau. Với MVVM, nó hiếm khi cần thiết, nhưng điều đó không có nghĩa là bạn sẽ không bao giờ cần đến nó. Ngoài ra, có phương tiện để có được điều khiển được tạo ra từ một datatemplate. Ví dụ, nếu bạn có một ItemsControl (Listbox vv), bạn có thể sử dụng listBox.ItemContainerGenerator.ContainerFromItem (listBox.SelectedItem); – Botz3000

6

Xóa IsEnabled và đặt TextBox là ReadOnly sẽ cho phép bạn chọn văn bản nhưng ngừng nhập người dùng.

IsReadOnly="True" 

Vấn đề duy nhất với cách tiếp cận này là mặc dù bạn sẽ không thể nhập vào Hộp văn bản nó vẫn sẽ 'Bật'.

Để xoay vòng (nếu bạn muốn?), Bạn chỉ có thể thêm kiểu để làm sáng văn bản và làm tối nền (để làm cho văn bản bị tắt).

Tôi đã thêm ví dụ sau với kiểu sẽ lật hộp văn bản giữa giao diện đã tắt và được bật.

<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

Một lưu ý tôi chỉ phát hiện (rõ ràng đây là một câu hỏi cũ nhưng điều này có thể giúp đỡ một người nào đó):

Nếu IsHitTestVisible=False sau đó chọn (và do đó Copy) cũng bị vô hiệu hóa.

0

Hơi sửa đổi chẳng hạn - để phù hợp với phong cách của WinForms (không phát minh ra phong cách mới của riêng bạn)

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> 

Và tất nhiên textbox của bạn phải có IsReadOnly = "True" thuộc tính thiết lập.

Các vấn đề liên quan