У вас есть три основные проблемы:
- Ваш InnerBackground, OuterBackground и WellBorder всегда равны нулю,
- В вашем шаблоне нет ContentPresenter,
- Ваши эллипсы имеют нулевой размер
Нулевые кисти
Причина, по которой InnerBackground, OuterBackground и WellBorder имеют значение null, заключается в том, что вы устанавливаете их в null в конструкторе. Например, эта строка является проблемой:
InnerBackGround = (RadialGradientBrush)this.Resources["WellSelectedInnerCircleBrush"];
В этой строке есть две проблемы:
- Он использует this.Resoures [], который просматривает только локальный ResourceDictionary. Чтобы сделать эквивалент StaticResource, вы должны заглянуть в ResourceDictionaries ваших предков, что означает вызов FindResource ().
- Он находится в конструкторе, поэтому он выполняется до того, как элемент управления имеет родителя. Поскольку на данный момент у него нет предков, даже FindResource () не будет работать для вас.
Лучшее решение этой проблемы - установить эти свойства в стиле, а не в конструкторе:
<Style TargetType="{x:Type local:WellImage}">
<Setter Property="Focusable" Value="false" />
<Setter Property="InnerBackground" Value="{DynamicResource WellSelectedInnerCircleBrush}" />
...
Если вы действительно хотите сделать это в конструкторе, вы можете создать там ссылку на DynamicResource:
SetValue(InnerBackgroundProperty,
new DynamicResourceExtension("WellSelectedInnerCircleBrush")
.ProvideValue());
Отсутствует ContentPresenter
Если бы вы включили ContentPresenter в свой шаблон, вы бы увидели строку «WellButton», даже если бы эллипсы были бы невидимы.
Вам следует подумать о том, чтобы изменить свой ControlTemplate, чтобы включить ContentPresenter для отображения свойства Content. Кажется бессмысленным назначать свойство Content, но не отображать его.
эллипсы нулевого размера
Для каждого эллипса устанавливается Width = "Auto" Height = "Auto", что для эллипса означает нулевой размер. Это сделает ваши эллипсы невидимыми, даже если у них есть кисти.
Также для сетки задано Width = "Auto" Height = "Auto", что означает сжатие его содержимого в мельчайшее возможное пространство. Это означает, что если для WellButton задано значение VerticalAlignment = "Stretch" или HorizontalAlignment = "Stretch", он упрямо откажется фактически растягиваться. Это плохая вещь в пользовательском элементе управления.
Удалите оба места, где вы говорите, что Ширина = "Авто" и Высота = "Авто", и вместо этого оставьте значение Высота и Ширина неустановленными.
Прочие вопросы и придирки
Ваш второй эллипс имеет StrokeThickness = "0", что не имеет смысла для меня, так как нет удара. Почему бы не оставить это? То же самое для RenderTransformOrigin, поскольку RenderTransform отсутствует.
Ваш первый эллипс не должен указывать HorizontalAlignment = "Stretch" VerticalAlignment = "Stretch", так как это значение по умолчанию.
Ваши привязки слишком сложны:
- Вы можете опустить «Path =», если путь не содержит вложенных свойств.
- Вы можете опустить «Mode = OneWay», так как это значение по умолчанию, но самое главное:
- Вместо этого вы можете использовать TemplateBinding, который намного чище:
Синтаксис TemplateBinding:
<Ellipse Stroke="{TemplateBinding WellBorder}"
... />
Поля на вашем втором эллипсе настолько велики, что даже если в вашем коде C # будет учтено Width = "40" Height = "40" (поскольку проблема с Auto была исправлена), эллипс все равно не будет иметь размера. Также кажется странным иметь эллипс с таким необычным краем.
Nitpick: «Фон» - это одно английское слово, в середине которого нет заглавной буквы G.