2009-04-01 14 views
4

Я пытаюсь применить стиль к украшенному элементу, но я не знаю правильного синтаксиса. Вот то, что я пробовал:WPF - Как применить стиль к AdornedElementPlaceholder's 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"/> 

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

Спасибо,

-Charles

ответ

9

нужно поставить, где ресурс откуда.

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

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

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

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

<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> 
+0

Спасибо, это имеет смысл. Я надеялся, что в ControlTemplate появится способ указать, что я хочу использовать «textStyleTextBox» при возникновении ошибки, в отличие от установки «Validation.ErrorTemplate» и «Style» в каждом текстовом поле, которое требует проверки. Можете ли вы придумать какой-либо способ сделать это? – Charles

+1

Вы можете использовать стили на уровне приложений (Application.Resources) без ключа, такого как стиль текстового блока, и все текстовые блоки автоматически будут выбирать этот стиль по умолчанию. – Crippeoblade

+0

Как создать собственное текстовое поле, происходящее из обычного текстового поля. Определите его стили и проверку ошибок здесь по умолчанию. Затем используйте свои собственные текстовые поля как обычно в других файлах Xaml. – Crippeoblade

Смежные вопросы