我使用telerik,但这对这个问题意义不大。我的应用程序是 WPF (.Net 4.5)。
我有一个样式,用于所有组合框,它有一个错误模板。样式如下所示:
<Style TargetType="{x:Type telerik:RadComboBox}" x:Key="RadComboBoxStyle" >
<Setter Property="FontFamily" Value="Calibri"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="Background" Value="{StaticResource InputBrush}" />
<Setter Property="BorderBrush" Value="{StaticResource InputBorderBrush}" />
<Setter Property="Validation.ErrorTemplate" Value="{StaticResource RadComboBoxValidationErrorTemplate}" />
</Style>
我的 ErrorTemplate 看起来像这样:
<ControlTemplate TargetType="{x:Type Control}" x:Key="RadComboBoxValidationErrorTemplate">
<Grid ToolTipService.IsEnabled="True" ToolTipService.ShowOnDisabled="True"
ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors), Converter={StaticResource ValidationErrorsConverter}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border BorderBrush="{StaticResource ErrorBrush}" BorderThickness="3" Panel.ZIndex="999" HorizontalAlignment="Right" Margin="0,0,10,0"
Background="Transparent" DockPanel.Dock="right" Width="16" Height="16" CornerRadius="10">
<Rectangle Fill="{StaticResource ErrorBrush}" HorizontalAlignment="Stretch" VerticalAlignment="Center" Height="3" RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<RotateTransform Angle="315" />
</Rectangle.RenderTransform>
</Rectangle>
</Border>
<AdornedElementPlaceholder Name="customAdorner" VerticalAlignment="Center" >
<Border BorderBrush="{StaticResource ErrorBrush}" BorderThickness="1" />
</AdornedElementPlaceholder>
</Grid>
</ControlTemplate>
整个事情在一个全局 ResourceDictionary 中定义。
这段代码的作用是在组合框(Panel.ZIndex="999")的顶部放置一个“禁止标志”,就在下拉按钮之前(使用边距)。Border 和 Rectangle 使一个标志很像这样:Picture。
组合框本身必须能够保存在本地设置的工具提示。所以错误消息不能显示在组合框的工具提示中 - 除非我找到一种方法来组合两者而不必在本地解决它(我希望我的资源字典中的代码)。
我也不希望“禁止标志”处理鼠标点击(如果用户点击“禁止标志”,它会吞噬点击并防止组合框下拉。
我尝试在错误模板内的网格和边框上将 IsHitTestVisible 设置为 false,但这导致工具提示永远不会显示。我还尝试在相同的两个控件上将 IsEnabled 设置为 false,但这不会将鼠标点击发送到组合框本身(组合框中的列表不会下拉)。
有没有办法直接在组合框样式或错误模板中执行此操作?我什至不介意后面有代码——但我真的不想在使用组合框样式的地方添加代码。