wpf - 屏蔽到 WPF 日期选择器

标签 wpf

我想为 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>

现在每次我从 datepicker 应用程序打开日历时都会卡住,因为 DatePickerTextBoxInputMaskBehavior 中更改的文本被递归触发。
知道如何处理吗?

最佳答案

基本控件 (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));
            }

        }
    }

关于wpf - 屏蔽到 WPF 日期选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25484044/

相关文章:

c# - 如何在 WPF 的 DataGridTextColumn 中格式化工具提示的字符串

wpf - IsMouseOver 鼠标捕获时

c# - 使用 WPF 和 SlimDx (DirectX 10/11)

c# - 数据绑定(bind)到列数未知的网格

wpf - 从源获取绑定(bind)目标?

WPF 投影

WPF - DataGridComboBoxColumn 示例

c# - 在 MVVM 中使用 ScrollViewer 滚动到控件的顶部

.net - 将上下文菜单命令参数绑定(bind)到数据网格属性

c# - 为什么我的 ImageBrush 缩放平铺图像?