簡體   English   中英

ComboBox的ControlTemplate周圍的邊框

[英]Borders around ControlTemplate for ComboBox

我有以下ControlTemplate用於驗證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>

根據ErrorContent,我決定圍繞ComboBox繪制哪個Border

Converter ErrorContentToErrorVisibilityConverter看起來像

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

一切都很好。 但是,如果我在ComboBox產生一個錯誤,從而顯示了ControlTemplate for Errors,則繪制邊框的邊界不在ComboBox的“真實”邊框處。

ControlTemplate的用法如下:

這是一個示例模板,我確實嘗試為您簡化它

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

嘗試一下,讓我知道這與您的結果有多接近,我們也可以進一步簡化觸發器,我是根據假設進行的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM