2010-04-19 4 views
0

У меня есть шаблон управления на одной из моих страниц, и я назначаю этот шаблон свойству Validation.ErrorTemplate моего текстового поля. Следующий код даст вам лучший обзор.Использование шаблона управления для всех элементов управления в приложении

<ControlTemplate x:Key="ValidationErrorTemplate"> 
      <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> 
       <AdornedElementPlaceholder/> 
       <Image Name="ValidizorImage" Stretch="None" Source="validizor.gif" ToolTip="{Binding [0].ErrorContent}" ToolTipService.InitialShowDelay="0" ToolTipService.ShowDuration="60000"/> 
      </StackPanel> 
</ControlTemplate>

Вышеупомянутый шаблон устанавливает изображение в конце текстового поля, имеющего ошибку. Этот шаблон используется, как показано ниже.

<TextBox Grid.Column="5" Grid.Row="1" x:Name="txtemail" Grid.ColumnSpan="3" Margin="0,1,20,1" Validation.ErrorTemplate="{StaticResource ValidationErrorTemplate}" />

Мой вопрос здесь

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

Я пытался ставить тот же код шаблона управления в пользовательский элемент управления говорят «ErrorUC»

 
<UserControl...> 
    <Grid> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> 
      <AdornedElementPlaceholder/> 
      <Image Name="ValidizorImage" Stretch="None" Source="validizor.gif" ToolTip="{Binding [0].ErrorContent}" ToolTipService.InitialShowDelay="0" ToolTipService.ShowDuration="60000"/> 
     </StackPanel> 
    </Grid> 
</UserControl> 

и использовали его, как показано ниже

TextBox1.SetResourceReference 
(System.Windows.Controls.Validation.ErrorTemplateProperty, new ErrorUC());

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

ответ

2

Validation.ErrorTemplate Недвижимость ожидает ControlTemplate и не имеет UserControl. Вот почему ваш код не работает. Вам лучше сохранить свой «ValidationErrorTemplate» и поместить его в общий ResourceDictionary, доступ к которому вы можете получить повсюду в своем приложении (или там, где оно вам нужно). Например, вы можете поместить его в свой App.xaml, а затем ссылаться на него с помощью DynamicResource.


EDIT: Хорошо, здесь мы идем с более подробным объяснением. Если это не является требованием, я думаю, что вам лучше работать с XAML, а не слишком много загрузки кода ResourceDictionaries и назначения свойств. Вы легко можете добиться желаемого поведения в XAML следующим образом:

Открыть файл под названием «App.xaml» в вашем проекте приложения WPF. Visual Studio/Blend автоматически создаст этот файл для вас. Этот файл содержит раздел <Application.Resources>. Добавьте свой ControlTemplate в этом разделе:

<Application.Resources> 
    <ControlTemplate x:Key="ValidationErrorTemplate"> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> 
      <AdornedElementPlaceholder/> 
      <Image Name="ValidizorImage" Stretch="None" Source="validizor.gif" ToolTip="{Binding [0].ErrorContent}" ToolTipService.InitialShowDelay="0" ToolTipService.ShowDuration="60000"/> 
     </StackPanel> 
    </ControlTemplate> 
</Application.Resources> 

Теперь, просто присвоить этот шаблон ошибки к элементам управления с помощью Validation.ErrorTemplate свойства, как это:

<TextBox ... Validation.ErrorTemplate="{DynamicResource ValidationErrorTemplate}" /> 

Конечно, вы должны иметь привязки с ValidationRules, определенными для соответствующие свойства элемента управления (например, свойство Text TextBox). В простом приложении этот код работает для меня: изображение отображается, если проверка не выполняется.

Я не являюсь экспертом в выполнении всего этого в коде, поскольку я очень предпочитаю XAML определять пользовательский интерфейс. Но, насколько я могу судить, ваш код выглядит хорошо для меня. Действительно ли проверка действительно терпит неудачу? Проверьте это, удалив шаблон Validation.ErrorTemplate. Если ваш TextBox получает красную рамку, то это не сработает - иначе может возникнуть ошибка в вашей логике проверки ?!

HTH, gehho.

+0

привет HTH, я попробовал свое решение. Pls проверяет это сообщение так же, как я не могу соответствовать моему запросу в разделе комментариев. – samar

+0

привет, я получил его, добавив следующий код в xaml в текстовое поле, где мне нужен шаблон для работы. Validation.ErrorTemplate = "{DynamicResource ValidationErrorTemplate}" Но можем ли мы привести вышеупомянутое в код позади. Нечто похожее на TextBox1.SetResourceReference (Validation.ErrorTemplateProperty, ct); упомянутый выше ?? Пожалуйста, дайте мне знать. – samar

+0

Как я уже сказал, я не эксперт в этом. Согласно MSDN, [SetResourceReference (...)] (http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.setresourcereference.aspx) должно быть * похоже * на 'DynamicResource', но они не дают подробностей о различиях. Во всяком случае, я думаю, что он должен сделать то же самое для этого сценария. Вызывает ли ваш вызов 'System.Windows.Application.Current.Resources [" ValidationErrorTemplate "];' возвращает любое значение, или это 'null'? Если это «null», вы должны использовать вместо этого this.FindResource (...) '. – gehho

0

Я попробовал ваше решение

а) Я добавил dictionary.xaml в проекте и добавил свой шаблон управления к нему как

 
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ControlTemplate x:Key="ValidationErrorTemplate"> 
     <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> 
      <AdornedElementPlaceholder/> 
      <Image Name="ValidizorImage" Stretch="None" Source="validizor.gif" ToolTip="{Binding [0].ErrorContent}" ToolTipService.InitialShowDelay="0" ToolTipService.ShowDuration="60000"/> 
     </StackPanel> 
    </ControlTemplate> 
</ResourceDictionary> 

б) Я добавил этот словарь к моим ресурсам приложения, как

 
Uri uri = new Uri("my dictionary uri", UriKind.RelativeOrAbsolute); 

      ResourceDictionary dict = new ResourceDictionary(); 
      dict.Source = uri; 
      Application.Current.Resources.MergedDictionaries.Add(dict); 

с) Я пытался доступ к словарю, как

 
ControlTemplate ct = (ControlTemplate)System.Windows.Application.Current.Resources["ValidationErrorTemplate"]; 
TextBox1.SetResourceReference(Validation.ErrorTemplateProperty, ct); 

Еще мой шаблон управления не привязан. Я проверил, если шаблон управления есть в ресурсах приложения и я обнаружил, что на самом деле она есть то следующая строка дает мне истинный

Application.Resources.Contains("ValidationErrorTemplate");

Я пропускаю на что-то здесь ??

Спасибо,

Самар

+0

Пожалуйста, проверьте изменения в моем первоначальном ответе. – gehho