从事件触发器中更改属性

时间:2009-09-26 00:25:40

标签: c# .net wpf xaml triggers

我想要的只是默认情况下我的所有TextBox都将光标设置在文本的末尾,所以我想要伪代码:

if (TextChanged) textbox.SelectionStart = textbox.Text.Length;

因为我希望我的应用程序中的所有文本框都受到影响,所以我想使用一种样式。这个不起作用(出于显而易见的原因),但你明白了:

<Style TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <EventTrigger RoutedEvent="TextChanged">
      <EventTrigger.Actions>
        <Setter Property="SelectionStart" Value="{Binding Text.Length}"/>
      </EventTrigger.Actions>
    </EventTrigger>
  </Style.Triggers>
</Style>

编辑: 一个重要的事情是,只有在以编程方式分配Text属性时才应设置SelectionStart属性,而不是在用户编辑文本框时。

2 个答案:

答案 0 :(得分:3)

您确定要在应用中的所有文本框中使用此行为吗?这将使用户几乎不可能(或至少非常痛苦)编辑TextBox中间的文本......

无论如何,有一种方法可以做你想要的......假设你的样式是在ResourceDictionary文件中定义的。首先,您需要为资源字典创建一个代码隐藏文件(例如,Dictionary1.xaml.cs)。在此文件中写下以下代码:

using System.Windows.Controls;
using System.Windows;

namespace WpfApplication1
{
    partial class Dictionary1
    {
        void TextBox_TextChanged(object sender, RoutedEventArgs e)
        {
            TextBox textBox = sender as TextBox;
            if (textBox != null)
                textBox.SelectionStart = textBox.Text.Length;
        }
    }
}

在XAML中,将x:Class属性添加到R​​esourceDictionary元素:

<ResourceDictionary x:Class="WpfApplication1.Dictionary1"
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

按如下方式定义您的风格:

<Style TargetType="{x:Type TextBox}">
    <EventSetter Event="TextChanged" Handler="TextBox_TextChanged" />
</Style>

TextBox_TextChanged方法现在将处理所有文本框的TextChanged事件。

应该可以使用x:Code属性在XAML中内联编写代码,但我无法使其工作......

答案 1 :(得分:1)

创建attached behaviour。附加行为是一种挂钩任意事件处理的方式,可以通过Style应用它。