已禁用控件但具有选择和复制功能

时间:2015-11-13 10:21:52

标签: c# wpf isenabled readonly-attribute

我正在编写一个应用程序,用户必须在几个特定的​​视图中单击“编辑”才能编辑它们,我通过将控制器(文本框,组合框等)绑定到我的“NotReadOnly”来解决这个问题。 “VM中的属性。

现在,我的用户希望能够从我的控制器(特别是文本框)复制数据,而无需先单击我的编辑按钮。这是不可能的,因为IsEnabled = false会禁用大多数功能。

更改为“IsReadOnly = True”不是替代方案,我想要一个禁用控制器的外观(背景,字体更改等),以便我的用户可以清楚地看到它不处于编辑模式,而我不是想要通过绑定到VM中的“ReadOnly”属性来完成所有这些操作,还有一些情况下,多个后台属性确定是否启用了某些控制器。

所以我希望找到一些在禁用控制器中进行复制(最好也选择/滚动)的方法。

如果那是不可能的,有没有办法获得已禁用的控制器的外观和感觉,而无需为每个控制器添加大量的XAML?

2 个答案:

答案 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

答案 1 :(得分:1)

您不必将XAML添加到有控件的每个窗口。只需将此代码添加到App.Xaml项目的WPF文件中,您应用中的所有文本框控件都会对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