WPF — как применить стиль к AdornedElementPlaceholder AdornedElement?

Я пытаюсь применить стиль к украшенному элементу, но не знаю правильного синтаксиса. Вот что я пробовал:

    <!-- ValidationRule Based Validitaion Control Template -->
    <ControlTemplate x:Key="validationTemplate">
        <DockPanel>
            <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
            <AdornedElementPlaceholder Style="textStyleTextBox"/>
        </DockPanel>
    </ControlTemplate>

Единственная проблема в том, что следующая строка не работает:

            <AdornedElementPlaceholder Style="textStyleTextBox"/>

Любая помощь будет принята с благодарностью.

Спасибо,

-Чарльз


person Charles    schedule 01.04.2009    source источник


Ответы (1)


Нужно указать, откуда берется ресурс.

<TextBox Style="{StaticResource textStyleTextBox}"/>

Затем определите стиль в ресурсе, таком как ресурсы пользовательского элемента управления:

<UserControl.Resources>
  <Style TargetType="TextBox" x:Key="textStyleTextBox">
    <Setter Property="Background" Value="Blue"/>
  </Style>
</UserControl.Resources>

Однако я не верю, что вы хотите установить стиль элемента украшения внутри заполнителя. Это просто заполнитель для любого элемента управления с этим шаблоном. Вы должны установить стиль украшенного элемента в самом элементе, как в примере, который я привел выше. Если вы хотите стилизовать элемент управления на основе его проверки, то что-то вроде этого:

<Window.Resources>
   <ControlTemplate x:Key="validationTemplate">
       <DockPanel>
           <TextBlock Foreground="Yellow" Width="55" FontSize="18">!</TextBlock>
           <AdornedElementPlaceholder/>
       </DockPanel>
   </ControlTemplate>
   <Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
       <Style.Triggers>
           <Trigger Property="Validation.HasError" Value="true">
               <Setter Property="Background" Value="Red"/>
               <Setter Property="Foreground" Value="White"/>
           </Trigger>
       </Style.Triggers>
   </Style>
</Window.Resources>
<StackPanel x:Name="mainPanel">
    <TextBlock>Age:</TextBlock>
    <TextBox x:Name="txtAge"
             Validation.ErrorTemplate="{DynamicResource validationTemplate}"
             Style="{StaticResource textBoxInError}">
         <Binding Path="Age" UpdateSourceTrigger="PropertyChanged" >
             <Binding.ValidationRules>
                 <ExceptionValidationRule/>
             </Binding.ValidationRules>
         </Binding>
    </TextBox> 
</StackPanel>
person Crippeoblade    schedule 01.04.2009
comment
Спасибо, это имеет смысл. Я надеялся, что в ControlTemplate будет способ указать, что я хочу использовать свой «textStyleTextBox» при возникновении ошибки, а не устанавливать как «Validation.ErrorTemplate», так и «Style» для каждого текстового поля, которое требует проверки. Вы можете придумать какой-нибудь способ сделать это? - person Charles; 01.04.2009
comment
Вы можете использовать стили на уровне приложения (Application.Resources) без ключа, такого как стиль текстового блока, и все текстовые блоки автоматически подберут этот стиль по умолчанию. - person Crippeoblade; 02.04.2009
comment
Как насчет создания собственного текстового поля на основе обычного текстового поля. Определите его стили и проверку ошибок здесь по умолчанию. Затем используйте свое собственное текстовое поле, как обычно, в других файлах Xaml. - person Crippeoblade; 02.04.2009