Отключенные элементы управления, но с возможностью выбора и копирования
Я пишу приложение, в котором пользователь должен щелкнуть "изменить" в нескольких конкретных представлениях, чтобы иметь возможность их редактировать. Я решил это, связав контроллеры (текстовые поля, комбинированные списки и т. Д.) IsEnabled со своим свойством "NotReadOnly" в В.М.
Теперь мои пользователи хотят иметь возможность копировать данные с моих контроллеров (в частности, текстовых полей) без необходимости сначала нажимать кнопку "Изменить". Это невозможно, поскольку IsEnabled = false отключает большинство функций.
Изменение на "IsReadOnly = True" не является альтернативой, я хочу внешний вид отключенного контроллера (фон, изменения шрифта и т. Д.), Чтобы мои пользователи могли четко видеть, что он не находится в режиме редактирования, а я не хочу делать все это с привязками к моему свойству "ReadOnly" в ВМ, также есть случаи, когда более чем одно свойство фона определяет, включен ли какой-либо контроллер или нет.
Поэтому я надеюсь найти способ заставить копию (и, предпочтительно, также выбирать / прокручивать) работать в отключенных контроллерах.
Если это невозможно, есть ли способ получить внешний вид отключенного контроллера без добавления тонны XAML к каждому отдельному контроллеру?
2 ответа
Вам не нужно добавлять 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>
Невозможно выделить текст из отключенного текстового поля. То, что вы можете сделать, это сделать его доступным только для чтения и установить аналогично отключенному
<TextBox IsEnabled="False">Disabled</TextBox>
<TextBox IsReadOnly="True" Text="Readonly" Background="LightGray" Foreground="Gray"></TextBox>
см. этот пост: Как изменить отключенный цвет фона TextBox в WPF