2016-01-26 4 views
0

в моем App.xaml Я определил ресурс для Validation.ErrorTemplate, который зависит от динамического ресурса BorderBrush. Я намерен определить уникальный BorderBrush в каждом окне, которое у меня есть, а также внутри разных блоков внутри окна.Динамический поиск ресурсов Wpf для Validation.ErrorTemplate

<!--validation error template--> 
<ControlTemplate x:Key="NonValid"> 
    <Border BorderBrush="{DynamicResource BorderBrush}" BorderThickness="2" Margin="5"> 
     <AdornedElementPlaceholder x:Name="ui"/> 
    </Border> 
</ControlTemplate> 

и это один, чтобы продемонстрировать мою проблему (также с динамической кистью ресурса)

<!--test template--> 
<ControlTemplate x:Key="ButtonRes" TargetType="Button"> 
    <Border BorderBrush="{DynamicResource BorderBrush}" BorderThickness="2" Background="Khaki"> 
     <ContentPresenter /> 
    </Border> 
</ControlTemplate> 

и теперь окно, где я использую эти шаблоны можно решить кисти ресурс для нормального шаблона, но не для Validation.ErrorTemplate !

how it look like

<Window x:Class="MyApp.MyWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Test" Height="300" Width="300"> 
    <Window.Resources> 
     <!-- window overrides resource--> 
     <SolidColorBrush x:Key="BorderBrush" Color="Blue"/> 
    </Window.Resources> 

    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 

     <!-- button can see window resource--> 
     <Button Template="{StaticResource ButtonRes}"/>   

     <Grid Grid.Row="1"> 
      <Grid.Resources> 
       <!-- grid overrides resource--> 
       <SolidColorBrush x:Key="BorderBrush" Color="Red"/> 
      </Grid.Resources> 

      <Grid.RowDefinitions> 
       <RowDefinition/> 
       <RowDefinition/> 
      </Grid.RowDefinitions> 

      <!-- button can see grid resource--> 
      <Button Template="{StaticResource ButtonRes}"/> 

      <!-- errorTemplate CAN  SEE window resource--> 
      <!-- errorTemplate CAN NOT SEE grid resource--> 
      <TextBox Grid.Row="1" VerticalAlignment="Center" Text="{Binding Name}" 
       Validation.ErrorTemplate="{StaticResource NonValid}"/> 
     </Grid> 
    </Grid> 
</Window> 

, что я должен сделать, чтобы получить RED границу вокруг TextBox?

ответ

2

Поведение, которое вы видите, прекрасно. Рассуждение за этим:

Validation.ErrorTemplate размещено в adorner layer окна, которое размещено над всеми другими элементами управления в окне. Вот почему он не может видеть ресурс, определенный на уровне Grid, и разрешать ссылку с ресурсом окна.

Если вы хотите, чтобы это было разрешено динамически, единственным возможным решением является объявление его в ресурсах Windows или использование статического назначения.

+0

моей главной целью является параметризация 'ErrorTemplate' индивидуально. Я попытался сделать это, используя местные ресурсы, но забыл о поведении adorner. Спасибо за разъяснение – ASh