首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF:我能把一个函数(PreviewTextInput)变成静态资源吗?

WPF:我能把一个函数(PreviewTextInput)变成静态资源吗?
EN

Stack Overflow用户
提问于 2022-09-30 08:30:48
回答 1查看 59关注 0票数 0

我在不同的控件中有多个文本框,它们的PreviewTextInput中需要相同的逻辑。目前,我刚刚将我的自定义PreviewTextInput函数复制到每个控件后面的代码中。

我希望避免复制代码,只需将函数放在一个单一的位置,并将所有不同的文本框绑定到该位置。所以我想我可以使用静态资源,但我不知道我将如何继续这样做。

代码语言:javascript
运行
复制
    The *PreviewTextInput* function i would like to access globally:
    public void NumberValidationTextBox(object sender, TextCompositionEventArgs e)
    {
        Regex regex = new Regex("[^-0-9.,]+");
        e.Handled = regex.IsMatch(e.Text);
    }

我找到了一个我不喜欢的解决方案,因为它需要设置文本框的整个模板。通过在Generic.xml的代码隐藏中添加上面的函数,然后在其xaml文件中:

代码语言:javascript
运行
复制
<ControlTemplate x:Key="NumberValidationTextBox">
    <TextBox PreviewTextInput="NumberValidationTextBox"/>
</ControlTemplate>

然后通过设置Template="{StaticResource NumberValidationTextBox}“来绑定。然而,这将取代模板。我只想设置PreviewTextInput。是否有可能为这个偶数函数创建一个静态资源?

编辑:我找到了第二个解决方案,但我仍然不满意:

用可以全局访问的规则定义正则表达式(我做了Generic.cs.xml):

代码语言:javascript
运行
复制
public static Regex numberRegex = new Regex("[^-0-9.,]+");

然后,在每个需要其文本框正则表达式的控件的代码隐藏内部:

代码语言:javascript
运行
复制
    public void NumberValidationTextBox(object sender, TextCompositionEventArgs e)
    {
        e.Handled = Generic.numberRegex.IsMatch(e.Text);
    }

但是,这仍然需要我在每个控件的代码隐藏中添加一个函数。我希望能够通过使用静态资源直接将Generic.cs.xml (最顶层的函数)绑定到控件中来坚持XAML。

我想知道这是否可能,或者我是否应该勉强解决解决方案2。

EN

回答 1

Stack Overflow用户

发布于 2022-09-30 13:59:38

StaticResource?不是的。但是您可以创建一个附加属性来设置正则表达式:

代码语言:javascript
运行
复制
public static class TextBoxExtensions
{
    public static readonly DependencyProperty RegularExpressionProperty =
        DependencyProperty.RegisterAttached("RegularExpression",
            typeof(string),
            typeof(TextBoxExtensions),
            new FrameworkPropertyMetadata(OnSet));

    public static string GetRegularExpression(TextBox target) =>
        (string)target.GetValue(RegularExpressionProperty);

    public static void SetRegularExpression(TextBox target, string value) =>
        target.SetValue(RegularExpressionProperty, value);

    private static void OnSet(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TextBox textBox = (TextBox)d;
        textBox.PreviewTextInput += OnPreviewTextInput;
    }

    private static void OnPreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        string regularExpression = GetRegularExpression((TextBox)sender);
        if (!string.IsNullOrEmpty(regularExpression))
        {
            Regex regex = new Regex(regularExpression);
            e.Handled = regex.IsMatch(e.Text);
        }
    }
}

使用:

代码语言:javascript
运行
复制
<TextBox local:TextBoxExtensions.RegularExpression="[^-0-9.,]+"/>

这允许您为每个TextBox指定一个不同的正则表达式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73905980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档