2015-11-13 3 views
0

Я пишу приложение, в котором пользователь должен щелкнуть «редактировать» в нескольких отдельных представлениях, чтобы иметь возможность редактировать их, я решил это, привязывая контроллеры (текстовые поля , comboboxes и т. д.) IsEnabled для моего свойства NotReadOnly в VM.Отключенные элементы управления, но с возможностью выбора и копирования

Теперь мои пользователи хотят иметь возможность копировать данные с моих контроллеров (в частности, текстовые поля), не нажимая сначала мою кнопку редактирования. Это невозможно, поскольку IsEnabled = false отключает большинство функций.

Переход на «IsReadOnly = True» не является альтернативой, я хочу, чтобы внешний вид отключенного контроллера (фон, изменения шрифта и т. Д.), Чтобы мои пользователи могли ясно видеть, что это не в режиме редактирования, t хочу сделать все это с привязками к моему свойству «ReadOnly» в виртуальной машине, также есть случаи, когда более одного свойства фона определяет, включен ли какой-либо контроллер или нет.

Поэтому я надеюсь найти способ получения копии (и, желательно, выбор/прокрутку), работающий в отключенных контроллерах.

Если это невозможно, есть ли способ получить внешний вид отключенного контроллера без необходимости добавлять тонну XAML для каждого отдельного контроллера?

ответ

1

Вы не должны добавлять XAML к каждому окну, где есть ваши средства управления. Просто добавьте этот код в App.Xaml файл вашего WPF проекта и все ваши элементы управления TextBox в вашем приложении будет иметь такое же поведение для IsEnabled=false:

<SolidColorBrush x:Key="DisabledForegroundBrush" Color="Red" /> 
     <SolidColorBrush x:Key="DisabledBackgroundBrush" Color="White" /> 
     <Style TargetType="TextBox"> 
      <Setter Property="Background" Value="White"/> 
      <Setter Property="BorderBrush" Value="Black"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="TextBox"> 
         <Border Name="Bd" BorderThickness="{TemplateBinding BorderThickness}" 
              BorderBrush="{TemplateBinding BorderBrush}" 
              Background="{TemplateBinding Background}" 
              SnapsToDevicePixels="true"> 
          <ScrollViewer Name="PART_ContentHost" Background="{TemplateBinding Background}" 
              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsReadOnly" Value="True"> 
           <Setter Value="{StaticResource DisabledBackgroundBrush}" Property="Background" /> 
           <Setter Value="{StaticResource DisabledForegroundBrush}" Property="Foreground" /> 
           <Setter TargetName="PART_ContentHost" Property="Background" Value="Blue"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

Если вы хотите, чтобы ваши стили, которые будут использоваться во всем приложении, через различные окна, вы можете определить его для всего приложения:

<Application x:Class="WpfApplication.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:WpfApplication" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 

     <SolidColorBrush x:Key="DisabledForegroundBrush" Color="Red" /> 
     <SolidColorBrush x:Key="DisabledBackgroundBrush" Color="White" /> 
     <Style TargetType="TextBox"> 
      <!--The code omitted for the brevity--> 
      </Setter> 
     </Style> 

    </Application.Resources> 
</Application> 

Read this superior tutorial about Styles

+0

Это кажется перспективным, б ut Я предполагаю, что вы имели в виду Trigger Property = «IsReadOnly», так как именно там я хочу широко применять стиль, если мне нужна возможность выбирать/копировать и отключать внешний вид? Благодаря! –

+0

@ Mårten уверен, что вы правы. Я обновил свой код в ответ. Если мой ответ является ответом на ваш вопрос, вы можете назначить его в качестве ответа, чтобы помочь другим людям найти аналогичный вопрос. – StepUp

+0

Несомненно, я попробую еще немного узнать, работает ли это так, как я предполагал. –

1

Невозможно выбрать текст из отключенного текстового поля. Что вы можете сделать, это сделать его только для чтения и установить аналогичное для отключенного.

<TextBox IsEnabled="False">Disabled</TextBox> 
<TextBox IsReadOnly="True" Text="Readonly" Background="LightGray" Foreground="Gray"></TextBox> 

см этот пост: How to change disabled background color of TextBox in WPF