我的一个页面中有一个控件模板,我将此模板分配给我的文本框的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”只能在模板中使用,而不能在用户控件中使用。如果我评论相同,我没有得到所需的结果。
答案 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");
我错过了什么吗?
谢谢,
萨马