0

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

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

更改为“IsReadOnly = True”不是替代方法,我想要禁用控制器的外观和感觉(背景、字体更改等),以便我的用户可以清楚地看到它不在编辑模式下,我不想这样做所有这些都绑定到我在 VM 中的“ReadOnly”属性,在某些情况下,多个背景属性确定是否启用了某个控制器。

所以我希望找到某种方法让副本(最好还选择/滚动)在禁用的控制器中工作。

如果这是不可能的,有没有什么方法可以让一个禁用的控制器的外观和感觉,而不必为每个控制器添加大量的 XAML?

4

2 回答 2

3

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

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

看到这篇文章:如何在 WPF 中更改 TextBox 的禁用背景颜色

于 2015-11-13T10:51:40.713 回答
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>

阅读这个关于Styles

于 2015-11-13T11:10:32.237 回答