简体   繁体   中英

Borders around ControlTemplate for ComboBox

I have the following ControlTemplate for the Validation of a ComboBox

<ControlTemplate x:Key="ComboBoxHighlightTemplate" TargetType="Control">
    <Grid ClipToBounds="False">
        <Border BorderBrush="{StaticResource fokusBrush}" BorderThickness="2.5" Margin="-1" Visibility="{Binding ElementName=adornedElementHighligh,
            Path=AdornedElement.(Validation.Errors)[0].ErrorContent, Converter={StaticResource inverseErrorContentVisibilityConverter}}">
            <AdornedElementPlaceholder Name="adornedElementHighligh"/>
        </Border>

        <Border BorderBrush="Red" BorderThickness="1" Margin="-1" Visibility="{Binding ElementName=adornedElement,
            Path=AdornedElement.(Validation.Errors)[0].ErrorContent, Converter={StaticResource errorContentToErrorVisibilityConverter}}">
            <AdornedElementPlaceholder Name="adornedElement" />
        </Border>
        <Image HorizontalAlignment="Right" VerticalAlignment="Top" Visibility="{Binding ElementName=adornedElement,
            Path=AdornedElement.(Validation.Errors)[0].ErrorContent, Converter={StaticResource errorContentToErrorVisibilityConverter}}"
                Width="16" Height="16" Margin="0,-9,-9,0" Source="{x:Static helper:ImageHelper.ErrorImage}"
                ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
    </Grid>
</ControlTemplate>

Depending on the ErrorContent I decide which Border I draw around the ComboBox .

The Converter ErrorContentToErrorVisibilityConverter looks like

internal class ErrorContentToErrorVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is string)
        {
            if (((string) value).EndsWith("not an error"))
                return Visibility.Hidden;
        }
        return Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Everything just works fine. But if I produce an error in my ComboBox so that the ControlTemplate for Errors is shows, the bounds of the drawn borders are not at the "real" borders of the ComboBox .

The usage of the ControlTemplate looks like:

here is a sample template, I did try to simplify it for you

    <ControlTemplate x:Key="ComboBoxHighlightTemplate"
                     TargetType="Control">
        <Grid ClipToBounds="False">
            <AdornedElementPlaceholder Name="adornedElement" />
            <Border BorderBrush="Red"
                    BorderThickness="1"
                    x:Name="errorBorder" />
            <Image HorizontalAlignment="Right"
                   VerticalAlignment="Top"
                   x:Name="image"
                   Width="16"
                   Height="16"
                   Margin="0,-9,-9,0"
                   Source="{x:Static helper:ImageHelper.ErrorImage}"
                   ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
        </Grid>
        <ControlTemplate.Triggers>
            <DataTrigger Binding="{Binding AdornedElement.(Validation.Errors)[0].ErrorContent, ElementName=adornedElement,Converter={StaticResource errorContentToErrorVisibilityConverter}}"
                         Value="Hidden">
                <Setter Property="BorderBrush"
                        TargetName="errorBorder"
                        Value="{StaticResource fokusBrush}" />
                <Setter Property="BorderThickness"
                        TargetName="errorBorder"
                        Value="2.5" />
                <Setter Property="Visibility"
                        TargetName="image"
                        Value="Collapsed" />
            </DataTrigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

try it and let me know how close is this to your results, we may also simplify the trigger a bit further, I did this on assumptions.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM