文本框只读“;“开/关”;介于;“双击并失去焦点事件”;在wpf中
我有一个类似下面xaml的控件,启用了只读文本框只读“;“开/关”;介于;“双击并失去焦点事件”;在wpf中,wpf,textbox,wpf-controls,wpf-4.0,Wpf,Textbox,Wpf Controls,Wpf 4.0,我有一个类似下面xaml的控件,启用了只读 <TextBox Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Background="Transparent" IsReadOnly="True" BorderThickness="0" TextWrapping="Wrap" > 现在,当我双击这个文本框时,我应该能够输入一个文本。 只读属性应变为false
<TextBox Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Background="Transparent" IsReadOnly="True" BorderThickness="0" TextWrapping="Wrap" >
现在,当我双击这个文本框时,我应该能够输入一个文本。
只读属性应变为false
如果我移动到此文本框以外的窗口中的其他项目,则该文本框应再次变为只读
我试着用触发器来做。但是没有得到正确的暗示。这里有人能帮我吗?你可以通过两个事件来实现,鼠标双击和失去焦点
<Grid>
<TextBox IsReadOnly="True"
MouseDoubleClick="TextBox_MouseDoubleClick"
LostFocus="TextBox_LostFocus"/>
</Grid>
您可以使用
System.Windows.Interactivity
assembly()来完成此操作
第一:创建帮助器类以设置属性:
public class SetterAction : TriggerAction<DependencyObject>
{
public SetterAction()
{
Setters = new List<Setter>();
}
public List<Setter> Setters { get; set; }
protected override void Invoke(object parameter)
{
foreach (var item in Setters)
{
AssociatedObject.SetValue(item.Property, item.Value);
}
}
}
您可以使用Style和EventTrigger来实现这一点
<Window xmlns:sys="clr-namespace:System;assembly=mscorlib" ...>
<Window.Resource>
<Style x:Key="MyTextBoxStyle" TargetType="{x:Type TextBox}">
<Style.Triggers>
<EventTrigger RoutedEvent="LostFocus">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0"
Storyboard.TargetProperty="(TextBox.IsReadOnly)">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<sys:Boolean>True</sys:Boolean>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="MouseDoubleClick">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0"
Storyboard.TargetProperty="(TextBox.IsReadOnly)">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<sys:Boolean>False</sys:Boolean>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
</Window.Resource>
...
<TextBox Style="{StaticResource MyTextBoxStyle}" .../>
</Window>
真的
假的
...
是否希望此文本框仅在失去焦点时启用IsReadonly?此Blend SDK程序集是否已获得许可?@shahulhameed您可以使用此程序集。检查这条线:我试过了。它正在工作。但当我双击文本框时,正常的行为是所有数据都将被选中。在这种方法中,默认情况下光标移动到内容的最后一个元素。但我需要的是正常的光标选择行为。我该怎么做不。但该行为不是我所要求的。我尝试了它,但它给了我以下错误“无法使用“System.Windows.Media.Animation.ObjectAnimationUsingKeyFrames”对“System.Windows.Controls.TextBox”上的“IsReadOnly”属性设置动画。”
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Background="Transparent" IsReadOnly="True" BorderThickness="0" TextWrapping="Wrap"
Height="30" Width="200">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:EventTrigger.Actions>
<local:SetterAction>
<local:SetterAction.Setters>
<Setter Property="TextBox.IsReadOnly" Value="False" />
<Setter Property="TextBox.Background" Value="Green" />
</local:SetterAction.Setters>
</local:SetterAction>
</i:EventTrigger.Actions>
</i:EventTrigger>
<i:EventTrigger EventName="LostFocus">
<i:EventTrigger.Actions>
<local:SetterAction>
<local:SetterAction.Setters>
<Setter Property="TextBox.IsReadOnly" Value="True" />
<Setter Property="TextBox.Background" Value="Red" />
</local:SetterAction.Setters>
</local:SetterAction>
</i:EventTrigger.Actions>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
<Window xmlns:sys="clr-namespace:System;assembly=mscorlib" ...>
<Window.Resource>
<Style x:Key="MyTextBoxStyle" TargetType="{x:Type TextBox}">
<Style.Triggers>
<EventTrigger RoutedEvent="LostFocus">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0"
Storyboard.TargetProperty="(TextBox.IsReadOnly)">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<sys:Boolean>True</sys:Boolean>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
<EventTrigger RoutedEvent="MouseDoubleClick">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0"
Storyboard.TargetProperty="(TextBox.IsReadOnly)">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<sys:Boolean>False</sys:Boolean>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
</Window.Resource>
...
<TextBox Style="{StaticResource MyTextBoxStyle}" .../>
</Window>