2013-04-30 9 views
0

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

Как я могу использовать ControlTemplate для добавления изображения без перевязывания всех свойств TextBox?

<StackPanel> 
    <StackPanel.Resources> 
     <ControlTemplate x:Key="TextBoxWithIndicator" TargetType="{x:Type TextBox}"> 
      <StackPanel Orientation="Horizontal"> 
       <!-- Re-bind {Binding Path=Property}, including some that I may miss --> 
       <TextBox Text="{TemplateBinding Text}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"/> 
       <Image Source="resources/exclaim.png" Visibility="{TemplateBinding Validation.HasError}"/> 
      </StackPanel> 
     </ControlTemplate> 
    </StackPanel.Resources> 
    <TextBox Template="{StaticResource TextBoxWithIndicator}" Width="120">Happy Go Lucky</TextBox> 
</StackPanel> 

Примечание Предшествующее блок кода представляет мои тщетные усилия в WPF до сих пор. Вероятно, это также неверно по нескольким подсчетам, например. вероятно, нужен ValueConverter для Visibility <--> Validation.HasError; Установка Width="120" на TextBox, кажется, регулирует ширину стека, а не ширину TextBox, несмотря на TemplateBinding и т. Д.

+0

Рассматривали ли вы использование '' Adorner' (http://msdn.microsoft.com/en-us/library/ms743737.aspx) вместо 'ControlTemplate'? –

+0

Также имейте в виду, что если вы просто говорите о настройке внешнего вида «TextBox», когда он имеет ошибку проверки, существует «Validation.ErrorTemplate», предназначенная специально для этой цели. [Здесь] (http://stackoverflow.com/questions/7434245/validation-error-style-in-wpf-similar-to-silverlight) - это ответ с кодом для его создания, который вы можете настроить. –

+0

@BrianS Извините, поскольку я новичок в WPF, я не знал о ErrorTemplate и Adorner. Я действительно хотел бы получить ответ, который применяется даже в случае исключения из контекста проверки ошибок. Я думаю, что Adorner должен быть тем, что я ищу. Если вы можете написать это как ответ, я отметю его. – Jake

ответ

0

Предлагаю заглянуть в Adorners. Это специальные FrameworkElements, которые визуализируются на специальном уровне Adorner Layer поверх визуальных элементов и предназначены для визуального отображения пользователю.

Вышеупомянутая ссылка содержит описание Adorners, а также пример пользовательского поля Adorner.

+0

Спасибо! К сожалению, моя проблема здесь не закончилась. Adorner был помещен в другой слой, поэтому мой StackPanel не изменил размер, чтобы соответствовать. Думаю, мне придется снова и снова смотреть. – Jake