WPF: Komplette Länge eines Controls mit adorner

11/02/2009 - 19:33 von Chris Oertel | Report spam
Hallo,
ich wollte nicht immer zu einer TextBox ein Label hinzufügen und habe eine
Textbox um einen Adorner mit dem dazugehörenden Label erweitert:

public class LabelTextBox : TextBox
{
public static readonly DependencyProperty LabelPositionProperty =
DependencyProperty.Register("LabelPosition", typeof(enAdornerPosition),
typeof(LabelTextBox), new FrameworkPropertyMetadata(enAdornerPosition.Left,
new PropertyChangedCallback(OnLabelPropertyChanged)));
public static readonly DependencyProperty LabelCaptionProperty =
DependencyProperty.Register("LabelCaption", typeof(string),
typeof(LabelTextBox), new FrameworkPropertyMetadata("LabelTextBox", new
PropertyChangedCallback(OnLabelPropertyChanged)));
public static readonly DependencyProperty LabelWidthProperty =
DependencyProperty.Register("LabelWidth", typeof(double),
typeof(LabelTextBox), new FrameworkPropertyMetadata((double)90, new
PropertyChangedCallback(OnLabelPropertyChanged)));

public LabelTextBox()
{ }

public double LabelWidth
{
get { return (double)GetValue(LabelWidthProperty); }
set { SetValue(LabelWidthProperty, value); }
}

public string LabelCaption
{
get { return (string)GetValue(LabelCaptionProperty); }
set { SetValue(LabelCaptionProperty, value); }
}

public enAdornerPosition LabelPosition
{
get {return (enAdornerPosition)GetValue(LabelPositionProperty); }
set {SetValue(LabelPositionProperty, value);}
}

static void OnLabelPropertyChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
LabelTextBox soBox = (LabelTextBox)d;
AdornerLayer soAdornerLayer = AdornerLayer.GetAdornerLayer(soBox);
if (soAdornerLayer != null)
{
try { foreach (Adorner soAdorner in
soAdornerLayer.GetAdorners(soBox)) { soAdornerLayer.Remove(soAdorner); } }
catch { }
double sdWidth = soBox.LabelWidth;
TextBlock soLabel = new TextBlock() { Text =
soBox.LabelCaption, Width = sdWidth, Foreground = soBox.Foreground };
GenericAdorner soAdoner = new GenericAdorner(soBox, soLabel,
soBox.LabelPosition, sdWidth);
soAdornerLayer.Add(soAdoner);
}
}
}

Funktioniert soweit eigentlich ganz gut, bis ich versuche das Control in der
Größe zu veràndern (oder das Window dies macht), dann wird es abenteuerlich,
da die Adornergröße nicht mit herangezogen wird.

Ein Versuch von mir war die Width Property zu überschreiben und immer die
Gesamtgröße (Textbox.Width + Label.Width) rauszugeben, aber das war auch
nicht wirklich ein Erfolg.

Hat jemand eine Idee, wie ich ideses Handicap lösen kann oder muß ich auch
in Zukunft meine Labels von Hand aufbringen?

Danke,
Chris
 

Lesen sie die antworten

#1 Frank Dzaebel
13/02/2009 - 08:26 | Warnen spam
Hallo Chris,

Deine Angaben sind bzgl. der Implementation
noch unvollstàndig.
Schick mir mal einfach mal Dein Projekt per Mail,
ich denke, das ist das einfachste.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen