遮罩到 WPF 日期选择器

5

我希望为 WPF 日期选择器控件添加掩码。我发现 DatePickerTextBox 无法进一步扩展。

因此,我决定为其添加交互行为。我使用以下代码实现:

掩码日期选择器类:

public class MaskedDatePicker : DatePicker
{
} 

我创建了一个类似下面的附加行为:

public class DatePickerTextBoxInputMaskBehavior : Behavior<DatePickerTextBox>
{
}

现在,在模板中我添加了这个行为:
<DatePickerTextBox x:Name="PART_TextBox"
    Grid.Row="0"
    Grid.Column="0"
    HorizontalContentAlignment="Stretch"
    VerticalContentAlignment="Stretch"
    Focusable="{TemplateBinding Focusable}"
    Foreground="{TemplateBinding Foreground}">
    <i:Interaction.Behaviors>
        <cleanPoc:DatePickerTextBoxInputMaskBehavior />
    </i:Interaction.Behaviors>
</DatePickerTextBox>

现在每次我从日期选择器打开日历时,应用程序会冻结,因为 DatePickerTextBoxInputMaskBehavior 中的文本更改被递归触发。 有什么处理方法吗?

1个回答

1
基础控件(DatePicker)对于DatePickerTextBox的一些操作无法通过将行为附加到DatePickerTextBox来真正控制...
获取对MaskedDatePicker控件本身的引用,并在控件的SelectedDate属性设置为新值时设置DatePickerTextBox的Text属性。请查看以下示例,如果您需要任何澄清,请告诉我。
祝你好运!
    public class DatePickerTextBoxInputMaskBehavior : Behavior<DatePickerTextBox>
        {
            ...
containing the event data.
            private void AssociatedObjectLoaded(object sender, System.Windows.RoutedEventArgs e)
            {
                this.Provider = new MaskedTextProvider(this.InputMask, CultureInfo.CurrentCulture);
                this.Provider.Set(this.AssociatedObject.Text);
                this.Provider.PromptChar = this.PromptChar;
                this.SetText(this.Provider.ToDisplayString());

                MaskedDatePicker dp = FindVisualParent<MaskedDatePicker>(this.AssociatedObject);
                var textProp = DependencyPropertyDescriptor.FromProperty(MaskedDatePicker.SelectedDateProperty, typeof(MaskedDatePicker));
                if (textProp != null)
                {
                    textProp.AddValueChanged(dp, OnHandler);
                }
            }

            private static T FindVisualParent<T>(DependencyObject dependencyObject) where T : DependencyObject
            {
                var parent = VisualTreeHelper.GetParent(dependencyObject);

                if (parent == null) return null;

                var parentT = parent as T;
                return parentT ?? FindVisualParent<T>(parent);
            }

            private void OnHandler(object s, EventArgs args)
            {
                this.UpdateText();
            }


            private void UpdateText()
            {
                if (this.Provider.ToDisplayString().Equals(this.AssociatedObject.Text))
                {
                    return;
                }

                MaskedDatePicker dp = FindVisualParent<MaskedDatePicker>(this.AssociatedObject);
                if (dp != null && dp.SelectedDate.HasValue)
                    SetText(dp.SelectedDate.Value.ToString("dd/MM/yyyy")); //format date here...


            }

            /// <summary>
            /// Sets the text.
            /// </summary>
            /// <param name="text">The text.</param>
            private void SetText(string text)
            {
                this.AssociatedObject.Text = string.IsNullOrWhiteSpace(text) ? string.Empty : string.Format(CultureInfo.CurrentCulture, text.ToString(CultureInfo.CurrentCulture.DateTimeFormat));
            }

        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接