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?