禁用控件但可以 select 和复制
Disabled controls but with ability to select and copy
我正在编写一个应用程序,用户必须在一些特定视图中单击 "edit" 才能对其进行编辑,我已经通过绑定控制器(文本框、组合框等)IsEnabled 解决了这个问题到虚拟机中我的 "NotReadOnly" 属性。
现在我的用户希望能够从我的控制器(特别是文本框)复制数据,而不必先单击我的编辑按钮。这是不可能的,因为 IsEnabled=false 会禁用大部分功能。
更改为 "IsReadOnly = True" 不是替代方案,我想要禁用控制器的外观和感觉(背景、字体更改等),以便我的用户可以清楚地看到它不处于编辑模式,而且我不我想在 VM 中通过绑定到我的 "ReadOnly" 属性 来完成所有这些操作,也有多个背景 属性 决定某个控制器是否启用的情况。
所以我希望找到一些方法让副本(最好还有 selecting/scrolling)在禁用的控制器中工作。
如果那不可能,有没有什么方法可以让一个禁用的控制器具有外观和感觉,而不必向每个控制器添加大量 XAML?
无法 select 来自禁用文本框的文本。您可以做的是将其设置为只读并将类似设置为禁用。
<TextBox IsEnabled="False">Disabled</TextBox>
<TextBox IsReadOnly="True" Text="Readonly" Background="LightGray" Foreground="Gray"></TextBox>
看到这个post:How to change disabled background color of TextBox in WPF
您不必将 XAML 添加到每个 window 有您的控件的地方。只需将此代码添加到 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>
如果您希望您的样式在整个应用程序、不同的 windows 中使用,您可以为整个应用程序定义它:
<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>
我正在编写一个应用程序,用户必须在一些特定视图中单击 "edit" 才能对其进行编辑,我已经通过绑定控制器(文本框、组合框等)IsEnabled 解决了这个问题到虚拟机中我的 "NotReadOnly" 属性。
现在我的用户希望能够从我的控制器(特别是文本框)复制数据,而不必先单击我的编辑按钮。这是不可能的,因为 IsEnabled=false 会禁用大部分功能。
更改为 "IsReadOnly = True" 不是替代方案,我想要禁用控制器的外观和感觉(背景、字体更改等),以便我的用户可以清楚地看到它不处于编辑模式,而且我不我想在 VM 中通过绑定到我的 "ReadOnly" 属性 来完成所有这些操作,也有多个背景 属性 决定某个控制器是否启用的情况。
所以我希望找到一些方法让副本(最好还有 selecting/scrolling)在禁用的控制器中工作。
如果那不可能,有没有什么方法可以让一个禁用的控制器具有外观和感觉,而不必向每个控制器添加大量 XAML?
无法 select 来自禁用文本框的文本。您可以做的是将其设置为只读并将类似设置为禁用。
<TextBox IsEnabled="False">Disabled</TextBox>
<TextBox IsReadOnly="True" Text="Readonly" Background="LightGray" Foreground="Gray"></TextBox>
看到这个post:How to change disabled background color of TextBox in WPF
您不必将 XAML 添加到每个 window 有您的控件的地方。只需将此代码添加到 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>
如果您希望您的样式在整个应用程序、不同的 windows 中使用,您可以为整个应用程序定义它:
<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>