using System; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Threading; using GCHR.Model; namespace GCHR.View { public partial class Ampel { private readonly Button[] _buttons; delegate void DelAsyncWindowAction(); public Ampel() { InitializeComponent(); _buttons = new[] { btnStatus, btnGruen, btnGelb, btnRot }; _anzeigeAnStatusAnpassen = delegate() { for (var i = 0; i < _buttons.Count(); i++) { _buttons[i].Visibility = (i == (int)_status) ? Visibility.Visible : Visibility.Hidden; } pbThread.Visibility = (_status == Ampelstatus.Arbeitend) ? Visibility.Visible : Visibility.Hidden; }; Status = Ampelstatus.Keine; } /// /// Muss festgelegt werden, dass dynamisch darauf zugegriffen werden kann. /// public static DependencyProperty SourceProperty = DependencyProperty.Register( "Message", typeof(String), typeof(Ampel)); /// /// Gibt an, ob der der Ampel zugehörige Prozess beendet ist. /// working und rot => false /// gelb und grün => true /// public bool Done { get { return (Status == Ampelstatus.Gruen || Status == Ampelstatus.Gelb); } } public Ampelstatus Status { get { return _status; } set { _status = value; Dispatcher.BeginInvoke(DispatcherPriority.Normal, _anzeigeAnStatusAnpassen); } } private Ampelstatus _status; private readonly DelAsyncWindowAction _anzeigeAnStatusAnpassen; public int Progress { set { DelAsyncWindowAction fortschritt = delegate { pbThread.Value = value; pbThread.IsIndeterminate = !(value > 0); }; pbThread.Dispatcher.BeginInvoke(DispatcherPriority.Normal, fortschritt); if (Status == Ampelstatus.Keine) { Status = Ampelstatus.Arbeitend; } if (value == 100 && Status != Ampelstatus.Rot) { Status = (Message == "") ? Ampelstatus.Gruen : Ampelstatus.Gelb; } } } /// /// Benutzt , um den Wert des Statustextes zu schreiben oder zu lesen. /// public string Message { get { return (String)GetValue(SourceProperty); } set { SetValue(SourceProperty, value.Trim()); } } public void ProgressChanged(int progress, object status) { Progress = progress; if (status is Status) { Status = ((Status)status).Ampelstatus; Message = ((Status)status).Message; } else if (status is Ampelstatus) { Status = (Ampelstatus)status; } else if (status is String && !((String)status).Equals("")) { Message += (String)status + Environment.NewLine; } } private void BtnStatusClick(object sender, RoutedEventArgs e) { // MessageBox.Show(Message); } public void Reset() { Status = Ampelstatus.Keine; Message = ""; } private void BtnStatusMouseEnter(object sender, MouseEventArgs e) { var btn = (Button)sender; btn.ToolTip = new ToolTip { Content = Message, StaysOpen = true }; } } }