XAML 代码中的函数调用?

Posted

技术标签:

【中文标题】XAML 代码中的函数调用?【英文标题】:Function call within XAML code? 【发布时间】: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() ?谢谢。

【问题讨论】:

【参考方案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>

参考文献

Josh Smith on Attached Behaviours

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

HTH,

【讨论】:

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

以上是关于XAML 代码中的函数调用?的主要内容,如果未能解决你的问题,请参考以下文章

没有 .xaml.cs 代码的 XAML 文件

如何在 XAML 中公开控件以便在其他类中看到

C#中如何实现WPF调用Winform中用户自定义的控件呢?

在Xamarin Forms Project中的OnAppearing方法中调用InitializeComponent

C# WPF中xaml怎么调用.cs中的数据?反过来怎么调用?

怎样在C#中调用DLL中的函数,最好有代码和详细说明