При пользовательском рисовании флажка, как привязать цвет заливки формы эллипса к переднему плану флажка?

Я пытаюсь сделать CheckBox, который выглядел бы как маленький светодиодный индикатор: ярко окрашен, когда установлен, серый, когда он не установлен. В моем приложении мне нужны такие индикаторы состояния с разными цветами светодиодов. Мне сказали, что «путь WPF» - найти элемент управления, который работает почти так же, как вы хотите, а затем настроить его, вот что я и пытаюсь.

Я нашел код для ColorToSolidColorBrushValueConverter, который позволит мне преобразовать цвет переднего плана CheckBox в кисть, которая будет использоваться при заливке светодиода.

Я честно думаю, что единственное, что мне нужно сделать сейчас, - это завершить привязку Path в свойстве Ellipse Fill, но я не смог определить правильную строку привязки. Я пробовал такие вещи, как Path = Foreground, Path = Target.Foreground, Path = TargetSource.Foreground, Path = Source.Foreground, Path = Parent.Foreground, но ничто не заставляет Ellipse показывать цвет заливки.

В моем коде я закомментировал триггер, настроенный для изменения цвета, когда флажок снят, поэтому я мог быть уверен, что триггер не ведет себя неожиданно и не мешает мне видеть цвет. Я удалил закомментированный код для краткости в этом посте, поэтому этот стиль, как показано, в настоящее время может отображать только состояние «отмечен».

          <converters:ColorToSolidColorBrushValueConverter x:Key="ColorToBrush" />

          <Style x:Key="StyleDotCheckBox" TargetType="{x:Type CheckBox}">
            <Setter Property="Template">
              <Setter.Value>
                <ControlTemplate TargetType="{x:Type CheckBox}">
                  <StackPanel Orientation="Horizontal">
                    <Ellipse x:Name="ColorDot"
                             HorizontalAlignment="Center"
                             Stretch="UniformToFill"
                             StrokeLineJoin="Round"
                             Stroke="Black"
                             Fill="{Binding Path=Foreground, Converter={StaticResource ColorToBrush}}"
                             Margin="1"
                             />
                  </StackPanel>
                </ControlTemplate>
              </Setter.Value>
            </Setter>
          </Style>

Я ожидаю, что эллипс с именем ColorDot в какой-то момент будет заполнен каким-то цветом, но он всегда пустой, я думаю, потому что я не определил правильный путь для привязки заливки.


person Charles Jenkins    schedule 29.07.2019    source источник


Ответы (1)


Fill="{TemplateBinding Background}"

это то, что вам нужно, поскольку вы устанавливаете это из ControlTemplate.

Конвертер не нужен, поскольку Background уже является Brush объектом.

person Peregrine    schedule 29.07.2019
comment
Ты прав! Я изменил свой код на Fill={TemplateBinding Foreground} и получил кучу сообщений об исключениях, но затем я перестроил, и все прояснилось, и элемент управления начал работать отлично. Спасибо! - person Charles Jenkins; 29.07.2019