对整个应用程序中的所有控件使用控制模板

时间:2010-04-19 07:59:07

标签: wpf-controls

我的一个页面中有一个控件模板,我将此模板分配给我的文本框的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 个答案:

答案 0 :(得分:2)

Validation.ErrorTemplate属性需要ControlTemplate而不是UserControl。这就是你的代码无效的原因。您最好保留“ValidationErrorTemplate”并将其放在共享的ResourceDictionary中,您可以在应用程序的任何位置(或您需要的地方)访问它。例如,您可以将其放在 App.xaml 中,然后使用DynamicResource引用它。


编辑:好的,我们在这里进行更详细的解释。除非是必需的,否则我认为您最好使用XAML而不是加载ResourceDictionaries和分配属性的代码太多。您可以在XAML中轻松实现所需的行为,如下所示:

在WPF应用程序项目中打开名为“App.xaml”的文件。 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}" />

当然,您必须为控件上的相应属性(例如TextBox的Text属性)定义一个ValidationRules和ValidationRules。在一个简单的应用程序中,此代码适用于我:如果验证失败,将显示图像。

我不是在代码中完成所有操作的专家,因为我非常喜欢XAML来定义UI。但据我所知,你的代码看起来还不错。验证真的失败了吗?通过删除Validation.ErrorTemplate来检查。如果你的TextBox有红色边框,那么它确实会失败 - 否则你的验证逻辑可能会出错?!

HTH,gehho。

答案 1 :(得分:0)

我尝试了你的解决方案

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

c)我尝试访问字典

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

我的控件模板仍未附加。我检查了控制模板是否在应用程序资源中,我发现确实存在,即下面的行给了我真实的

Application.Resources.Contains("ValidationErrorTemplate");

我错过了什么吗?

谢谢,

萨马