Использование шаблона элемента управления для всех элементов управления в приложении - PullRequest
0 голосов
/ 19 апреля 2010

У меня есть шаблон элемента управления на одной из моих страниц, и я назначаю этот шаблон свойству 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 ]

2 голосов
/ 19 апреля 2010

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


РЕДАКТИРОВАТЬ: ОК, мы идем с более подробным объяснением. Если это не является обязательным требованием, я думаю, что вам лучше работать с 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, геххо.

0 голосов
/ 19 апреля 2010

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

a) Я добавил в проект 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>

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

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);

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

Application.Resources.Contains("ValidationErrorTemplate");

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

Спасибо

Самар

...