gpt4 book ai didi

c# - 如何自动更改 Silverlight 文本框中的文本?

转载 作者:行者123 更新时间:2023-12-03 10:53:45 24 4
gpt4 key购买 nike

我在 silverlight 5 项目中使用 MVVM/Caliburn.Micro,我需要自动将用户在 silverlight 文本框中输入的文本更改为大写。

首先,我认为我可以将 ViewModel 上的支持变量设置为大写,并且双向绑定(bind)会更改文本。那没有用(尽管我相信如果我使用失去焦点事件会这样做,但我不能这样做,因为我还必须为 KeyUp 做其他事情,并且附加两个事件会导致 xaml 错误)

由于那不起作用,我尝试在 KeyUp 事件上调用方法。这在技术上是可行的,但是由于它正在替换文本,因此会将光标放回开头,因此用户最终会向后键入。

这似乎是相当简单的功能——如何将用户输入的文本转换为大写?我错过了一些简单的事情吗?

这是我现有的代码。 xml:

<TextBox x:Name="SomeName" cal:Message.Attach="[Event KeyUp] = [Action ConvertToUppercase($eventArgs)]" />

查看型号:
public void ConvertToUppercase(System.Windows.Input.KeyEventArgs e)
{
SomeName = _someName.ToUpper();
//Other code that doesn't concern uppercase
}

编辑替代解决方案:
McAden 提出了一个很好的通用解决方案。我也几乎同时意识到有一个替代解决方案(只需将文本框作为参数传递给大写方法并移动光标),所以这里也是代码:

xml:
<TextBox x:Name="SomeName" cal:Message.Attach="[Event KeyUp] = [Action ConvertToUppercase($source, $eventArgs)]; [Event KeyDown] = [Action DoOtherStuffThatIsntQuestionSpecific($eventArgs)]" />

cs方法:
public void ConvertToUppercase(TextBox textBox, System.Windows.Input.KeyEventArgs e)
{
//set our public property here again so the textbox sees the Caliburn.Micro INPC notification fired in the public setter
SomeName = _someName.ToUpper();

//move the cursor to the last so the user can keep typing
textBox.Select(SomeName.Length, 0);
}

当然还有 cs 标准 Caliburn.Micro 属性:
private String _someName = "";
public String SomeName
{
get
{
return _someName;
}
set
{
_someName = value;
NotifyOfPropertyChange(() => SomeName);
}
}

最佳答案

如上所述创建一个 ToUpper EventTrigger here .还为您尝试完成的任何其他功能创建另一个。在 xaml 中添加它们:

<TextBox Text="{Binding SomeName, Mode=TwoWay}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<myBehaviors:UpperCaseAction/>
</i:EventTrigger>
<i:EventTrigger EventName="TextChanged">
<myBehaviors:MyOtherAction/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>

编辑 :我已经使用以下方法对这个解决方案进行了全面测试(不涉及代码隐藏)

大写 Action :
public class UpperCaseAction : TriggerAction<TextBox>
{
protected override void Invoke(object parameter)
{
var selectionStart = AssociatedObject.SelectionStart;
var selectionLength = AssociatedObject.SelectionLength;
AssociatedObject.Text = AssociatedObject.Text.ToUpper();
AssociatedObject.SelectionStart = selectionStart;
AssociatedObject.SelectionLength = selectionLength;
}
}

其他行动:
public class OtherAction : TriggerAction<TextBox>
{
Random test = new Random();

protected override void Invoke(object parameter)
{
AssociatedObject.FontSize = test.Next(9, 13);
}
}

XAML 命名空间(在这种情况下,TestSL 是我的测试项目的命名空间 - 酌情使用您的命名空间):
xmlns:local="clr-namespace:TestSL"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

XAML 文本框
<Grid x:Name="LayoutRoot" Background="LightGray" Width="300" Height="200">
<TextBox TextWrapping="Wrap" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10" Width="100">
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<local:UpperCaseAction />
</i:EventTrigger>
<i:EventTrigger EventName="TextChanged">
<local:OtherAction />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
</Grid>

关于c# - 如何自动更改 Silverlight 文本框中的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13038909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com