Приложение содержит различные шаблоны для флажков. Они содержат несколько дочерних уровней, и мне нужно получить доступ к значениям определенного уровня.
Чтобы визуализировать:
Код: Выделить всё
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"/>
В настоящее время это класс украшения, который я пытаюсь подогнать к элементу:
Код: Выделить всё
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);
}
}
Что мне нужно сделать с этим файлом .xaml, который я могу вызвать Frameworklement CHACKBOXELEMENT.INNERPATH.HEIGTH < /code> или аналогичный в моем файле .CS? Почувствуйте, как ControlTemplate.triggers может быть полезным, но до сих пор я не понимаю ни одной вещи о них. br /> Редактировать 2:
После получения дополнительной попытки я нашел VisualTreeHelper < /code>. С этим я смог сделать это: < /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 == "InnerBoder");
if (innerBorder is not null)
{
adornableElement = innerBorder;
}
}
< /code>
Это, однако, кажется очень статичным и требует знания о шаблоне, а также сломается, если шаблон будет изменен. Есть ли способ решить это более элегантно?
Подробнее здесь: https://stackoverflow.com/questions/793 ... l-template