gpt4 book ai didi

wpf - 屏蔽到 WPF 日期选择器

转载 作者:行者123 更新时间:2023-12-04 21:41:22 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com