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

Я пишу приложение, в котором пользователь должен щелкнуть "изменить" в нескольких конкретных представлениях, чтобы иметь возможность их редактировать. Я решил это, связав контроллеры (текстовые поля, комбинированные списки и т. Д.) 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>

Прочитайте этот превосходный урок оStyles

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

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

см. этот пост: Как изменить отключенный цвет фона TextBox в WPF

Другие вопросы по тегам