/// <summary> /// When the expander expands, need to put the error message in the /// adorner layer because the controls below it, may have their own /// adorner validation error messages, this places the expander /// popup on top of all other adorder layer elements. /// </summary> void _objErrorsExpander_Expanded(object sender, RoutedEventArgs e) { //this forces the ErrorMessage to be reread from it's source this.InvalidateProperty(ErrorMessageProperty); var expanderGrid = VisualTreeSearchAssistant.FindVisualChild <Grid>(_errorsExpander); _errorsExpanderAdornerLayer = AdornerLayer.GetAdornerLayer(expanderGrid); String[] delimiter = { Environment.NewLine }; String[] errorMessages = this.ErrorMessage.Split(delimiter, StringSplitOptions.RemoveEmptyEntries); Array.Sort(errorMessages); var txt = new TextBlock { Width = this.Width, TextWrapping = TextWrapping.Wrap, Text = string.Join(Environment.NewLine + Environment.NewLine, errorMessages), Padding = new Thickness(5), Foreground = this.ErrorPopUpForeground, Background = this.ErrorPopUpBackground, Effect = new System.Windows.Media.Effects.DropShadowEffect { ShadowDepth = 2 } }; //need to move the TextBlock down below the expander and indent a little var obj = new TranslateTransform(5, _errorsExpander.ActualHeight + 2); txt.RenderTransform = obj; _textBlockAdorner = new TextBlockAdorner(expanderGrid, txt); _textBlockAdorner.MouseLeave -= _objTextBlockAdorner_MouseLeave; _textBlockAdorner.MouseEnter -= _objTextBlockAdorner_MouseEnter; _errorsExpanderAdornerLayer.Add(_textBlockAdorner); }
public override DataTemplate SelectTemplate(Object item, DependencyObject container) { var fwe = container as FrameworkElement; if (fwe != null) { var lbi = VisualTreeSearchAssistant.FindAncestor <ListBoxItem>(fwe); if (lbi != null) { var pi = (PropertyInformationViewModel)lbi.DataContext; PropertyChangedEventHandler lambda = null; lambda = (s, args) => { if (args.PropertyName == "ControlSpecificProperties") { pi.PropertyChanged -= lambda; var cp = (ContentPresenter)container; try { cp.ContentTemplateSelector = null; cp.ContentTemplateSelector = this; } catch { cp.ContentTemplateSelector = this; } } }; pi.PropertyChanged += lambda; var editEditor = (IEditEditor)pi.ControlSpecificProperties; return(fwe.FindResource(editEditor.TemplateResourceKey) as DataTemplate); } } return(base.SelectTemplate(item, container)); }
void Close() { var win = VisualTreeSearchAssistant.FindAncestor <Window>(this); win?.Close(); }