
Zitat von
El Tocho
Hey

,
ich bräuchte mal einen kleinen Rat.
Ich nutze derzeit einen normalen Datepicekr in einer WPF Anwendung und möchte, dass diese den Text "Mitarbeiter aktiv" anzeigt, wenn kein Datum ausgewählt wurde. Standartmäßig wird in einem solchen Falle ja "Datum auswählen" angezeigt.
Jemand eine Idee wie man das hinbekommen könnte?
mfg
El
Vorweg: Normalerweise interessiere ich mich nicht für das .NET-Framework, bin also kein Experte auf dem Gebiet. Daher besser andere fragen, wo es spezifisch wird. Aber trotzdem mal ein Versuch, in der Hoffnung, dass es nützlich ist:
Der Text scheint vorgegeben zu sein, Anpassung nicht vorgesehen. Das ist wieder so etwas, was mich in meiner Auffassung bestätigt, kein C#/.NET/CLI zu verwenden. Aber nun gut, will hier keinen Rant ablassen, obwohl ich von Anfang an davon überzeugt bin, dass .NET/CLI ein allgemein falscher Ansatz ist. Aber gut, bevor es philosophisch wird, lasse ich das.
Mit Google müsstest du etwas finden, Keywords:
wpf datepicker select a date change text
So bin ich hier fündig geworden und bedanke mich hiermit brav beim Autor Matt Hamilton für die schlanke Lösung:
http://matthamilton.net/datepicker-watermark
Also habe ich es mal folgendermaßen ergänzt und zusammengefasst, um dir etwas lästiges Suchen zu ersparen:
Code:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
namespace WpfApplication1
{
/// <summary>
/// Interaktionslogik für "App.xaml"
/// </summary>
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
EventManager.RegisterClassHandler(typeof(DatePicker), DatePicker.LoadedEvent,
new RoutedEventHandler(DatePicker_Loaded));
}
void DatePicker_Loaded(object sender, RoutedEventArgs e)
{
var dp = sender as DatePicker;
if (dp == null) return;
var tb = GetChildOfType<DatePickerTextBox>(dp);
if (tb == null) return;
var wm = tb.Template.FindName("PART_Watermark", tb) as ContentControl;
if (wm == null) return;
wm.Content = "Mitarbeiter aktiv!";
}
public static T GetChildOfType<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj == null) return null;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);
var result = (child as T) ?? GetChildOfType<T>(child);
if (result != null) return result;
}
return null;
}
}
}
Keine Ahnung, ob das deinen Anforderungen genügt, ob du noch etwas anpassen musst, ob es unter deinen Bedingungen hält usw. Ich habe das nur überflogen, scheint zu funktionieren, kann aber für nichts garantieren. Also viel Spaß! Vielleicht hat noch wer eine Idee, schaun wir mal.