So binden Sie Kinderdaten an das übergeordnete Element in WPF .xaml-Vorlage
Posted: 14 Feb 2025, 09:09
Ich habe vor kurzem einen neuen Job bekommen und die Aufgaben sind tiefer in WPF als mein aktuelles Fachwissen.
Die Anwendung enthält verschiedene Vorlagen für Kontrollkästchen. Sie enthalten mehrere Kinderstufen und ich muss auf die Werte eines bestimmten zugreifen.
Ich brauche den Wert der Größe, die die Innerborder nach dem richtigen Wert einen Zwiebeln hat, aber ich habe keine Ahnung, wie ich diesen Wert erhalten kann . Für andere Objekte in diesem Zusammenhang konnte ich die Informationen finden, die ich über die Eltern-Kind-Beziehungen im Code benötigte. Dies ist die Klasse für den Zwiebschen, den ich versuche, in das Element zu passen: < /p>
TL/DR:
Was muss ich mit dieser .xaml -Datei tun, die ich Frameworkelement nennen kann CheckBoxElement.innerPath.Heigth < /code> oder ähnlich in meiner .cs-Datei? < /p>
Ich habe versucht Fühle, dass die ControlTemplate.triggers hilfreich sein mag, aber bisher verstehe ich nichts über sie. Br /> Bearbeiten 2:
Nach mehr Versuchen fand ich den VisualTreehelper < /code>. Damit konnte ich das tun: < /p>
if (frameworkElement is CheckBox box)
{
var bulletDecorator = (BulletDecorator) VisualTreeHelper.GetChild(box, 0);
var bullet = (Grid)bulletDecorator.Bullet;
var innerBorder = bullet.Children.OfType().SingleOrDefault(x => x.Name == "InnerBorder");
if (innerBorder is not null)
{
adornableElement = innerBorder;
}
}
< /code>
Dies fühlt sich jedoch sehr statisch an und erfordert Kenntnis der Vorlage und wird auch brechen, wenn die Vorlage geändert wird. Gibt es eine Möglichkeit, dies eleganter zu lösen?
Die Anwendung enthält verschiedene Vorlagen für Kontrollkästchen. Sie enthalten mehrere Kinderstufen und ich muss auf die Werte eines bestimmten zugreifen.
Code: Select all
Grid.Column="1" Grid.ColumnSpan="5"
Grid.Row="2" Grid.RowSpan="5"
Data="M31,5 L19.5,5 19.5,19.5 34.5,19.5 34.5,11.75"
Stretch="Fill"
Stroke="White"/>
Code: Select all
public class RectangleAdorner : Adorner
{
public RectangleAdorner(UIElement adornedElement, bool isRequired, int? widthOffset, int? heightOffset) : base(adornedElement)
{
IsHitTestVisible = false;
IsRequired = isRequired;
HeightOffset = heightOffset.HasValue ? heightOffset.Value : 0;
WidthOffset = widthOffset.HasValue ? widthOffset.Value : 0;
}
public bool IsRequired { get; set; }
public int HeightOffset { get; set; }
public int WidthOffset { get; set; }
protected override void OnRender(DrawingContext drawingContext)
{
double actualWidth = this.AdornedElement.RenderSize.Width - WidthOffset;
double actualHeight = this.AdornedElement.RenderSize.Height - HeightOffset;
Rect adornedElementRect = new Rect(0, 0, actualHeight, actualWidth);
SolidColorBrush renderBrush = new SolidColorBrush(Colors.Green);
renderBrush.Opacity = 0.3;
double render_thickness = 2.0;
Pen renderPen = IsRequired ? new Pen(new SolidColorBrush(Colors.Red), render_thickness)
: new Pen(new SolidColorBrush(Colors.Green), render_thickness);
drawingContext.DrawRectangle(renderBrush, renderPen, adornedElementRect);
}
}
Was muss ich mit dieser .xaml -Datei tun, die ich Frameworkelement nennen kann CheckBoxElement.innerPath.Heigth < /code> oder ähnlich in meiner .cs-Datei? < /p>
Ich habe versucht Fühle, dass die ControlTemplate.triggers hilfreich sein mag, aber bisher verstehe ich nichts über sie. Br /> Bearbeiten 2:
Nach mehr Versuchen fand ich den VisualTreehelper < /code>. Damit konnte ich das tun: < /p>
if (frameworkElement is CheckBox box)
{
var bulletDecorator = (BulletDecorator) VisualTreeHelper.GetChild(box, 0);
var bullet = (Grid)bulletDecorator.Bullet;
var innerBorder = bullet.Children.OfType().SingleOrDefault(x => x.Name == "InnerBorder");
if (innerBorder is not null)
{
adornableElement = innerBorder;
}
}
< /code>
Dies fühlt sich jedoch sehr statisch an und erfordert Kenntnis der Vorlage und wird auch brechen, wenn die Vorlage geändert wird. Gibt es eine Möglichkeit, dies eleganter zu lösen?