【问题标题】:Function call within XAML code?XAML 代码中的函数调用?
【发布时间】:2011-03-03 18:32:50
【问题描述】:

我想在我的所有 TextBox 控件上设置一个样式,当它接收到键盘焦点时会执行以下操作:

1) 更改背景颜色
2) 调用 .SelectAll() 以突出显示所有文本

到目前为止我有这个:

<Style TargetType="TextBox">
<Style.Triggers>
            <Trigger Property="IsKeyboardFocusWithin" Value="True">
                <Setter Property="Background">
                    <Setter.Value>
                        <SolidColorBrush Color="#FFFFD1D9"/>
                    </Setter.Value>
                </Setter>
           </Trigger>
</Style.Triggers>
</Style>

有没有办法也可以调用 .SelectAll() ?谢谢。

【问题讨论】:

    标签: wpf xaml textbox triggers styles


    【解决方案1】:

    您可以使用附加的行为来做到这一点。

    示例

    public static class TextBoxBehaviour
    {
        public static bool GetSelectAll(TextBoxBase target)
        {
            return (bool)target.GetValue(SelectAllAttachedProperty);
        }
    
        public static void SetSelectAll(TextBoxBase target, bool value)
        {
            target.SetValue(SelectAllAttachedProperty, value);
        }
    
        public static readonly DependencyProperty SelectAllAttachedProperty = DependencyProperty.RegisterAttached("SelectAll", typeof(bool), typeof(TextBoxBehaviour), new UIPropertyMetadata(false, OnSelectAllAttachedPropertyChanged));
    
        static void OnSelectAllAttachedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            ((TextBoxBase)o).SelectAll();
        }
    }
    

    用法

    <Style TargetType="{x:Type TextBox}" xmlns:behaviours="clr-namespace:Controls.Behaviours">
      <Style.Triggers>
          <Trigger Property="IsKeyboardFocusWithin" Value="True">
              <Setter Property="Background" Value="#FFFFD1D9"/>
              <Setter Property="behaviours:TextBoxBehaviour.SelectAll" Value="True"/>
         </Trigger>
      </Style.Triggers>
    </Style>
    

    参考文献

    注意:无法测试上述实现,但理论上它应该可以正常工作™。

    HTH,

    【讨论】:

    • +1 很好的答案。几乎和我写的一样。就个人而言,我会将方法的主体更改为简单的((TextBoxBase)target).SelectAll(),以便在错误使用该属性时抛出一个可理解的异常。从 QA 的角度来看,从长远来看,这比默默地忽略此类错误要好:您可以提前发现错误,而不是让它们潜伏多年。
    • @Ray Burns:我同意。这是一个我正在努力改掉的坏习惯。我已经编辑了我的答案。
    • 谢谢你——它工作得很好。仅供参考,对于希望为 PasswordBox 实现此功能的任何人:实现一个单独的 PasswordBoxBehaviour 类并将所有出现的 TextBoxBase 替换为 PasswordBox。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2013-10-01
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多