已禁用控件,但可以选择和复制

本文关键字:选择 复制 但可以 控件 | 更新日期: 2023-09-27 18:21:56

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

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

更改为"IsReadOnly=True"不是一种选择,我想要一个禁用控制器的外观(背景、字体更改等),这样我的用户就可以清楚地看到它没有处于编辑模式,而且我不想在VM中绑定到我的"ReadOnly"属性时完成所有这些操作,也有多个后台属性决定某个控制器是否启用的情况。

因此,我希望找到一些方法,让副本(最好还有选择/滚动)在禁用的控制器中工作。

如果这是不可能的,有没有任何方法可以在不必为每个控制器添加大量XAML的情况下获得禁用控制器的外观?

已禁用控件,但可以选择和复制

无法从禁用的文本框中选择文本。您可以做的是使其只读,并将类似设置为禁用。

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

请参阅这篇文章:如何更改WPF 中禁用的TextBox背景色

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