7 Stimmen

WPF-Validierungssteuerungsvorlage überlappend

Ich habe ein Benutzersteuerelement mit einer Steuervorlage zur Anzeige von Validierungsfehlern, Validierungsvorlage:

<ControlTemplate x:Key="TextBoxPropertyValidationTemplate">
        <StackPanel>
            <Border BorderBrush="Red" BorderThickness="1">
                <AdornedElementPlaceholder x:Name="MyAdorner" />
            </Border>

            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Image Grid.Column="0" MaxHeight="16" MaxWidth="16"
                       Source="{Binding Source={StaticResource ValidationIcon}, Converter={StaticResource UriConverter}}" 
                       Margin="1" RenderOptions.BitmapScalingMode="HighQuality"
                       VerticalAlignment="Center" HorizontalAlignment="Center" />
                <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left"
                           Text="{Binding ElementName=MyAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"
                           TextWrapping="Wrap" Grid.Column="1" FontSize="10" Foreground="Red" />
            </Grid>

        </StackPanel>
    </ControlTemplate>

Und ich scheine ein ziemlich ärgerliches Problem nicht umgehen zu können, das so aussieht:

validation

Ich habe versucht, um mit Rändern auf der Benutzer-Steuerelement und auf der Vorlage auch einige Height=Auto usw. spielen, aber alle diese nicht wirklich helfen. Irgendwelche Ideen jemand?

Wenn das hilft, ist die Haupt-Benutzerkontrolle (die die mit Validierung verschachtelt) in einem TabItem mit einem AdornerDecorator.

Jede Hilfe ist willkommen.

6voto

Botz3000 Punkte 38010

Ich würde sagen, das liegt daran, dass Ihre Fehlermeldung auf der AdornerLayer die nicht an demselben Layout wie Ihr Steuerelement beteiligt ist. MSDN sagt "Das Rendering eines Adorner ist unabhängig vom Rendering des UIElements, an das der Adorner gebunden ist." und deshalb wird die Nachricht einfach über alles gelegt.

Sie könnten den Fehlertext in die ursprüngliche Vorlage einfügen, ihn aufgrund von Validation.HasError und sie auf diese Weise in den Layoutprozess einbeziehen.

Eine Änderung des Layouts des Steuerelements ist jedoch möglicherweise nicht der beste Weg, wenn ein Validierungsfehler auftritt. Sie könnten erwägen, zusätzliche Informationen in einem ToolTip bereitzustellen.

1voto

Sonic.S.Xiang Punkte 307

Alternativ können Sie, anstatt ControlTemplate zu verwenden, den TextBlock mit der Fehlermeldung neben der TextBox platzieren und die Eigenschaft Text festlegen, die den ErrorContent der TextBox bindet.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <TextBox x:Name="txtName" Grid.Row="0">
        <TextBox.Text>
            <Binding Path="Name" NotifyOnValidationError="True" ValidatesOnExceptions="True" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <common:RequiredFieldValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
    <TextBlock Grid.Row="1" Text="{Binding ElementName=txtName,Path=(Validation.Errors)[0].ErrorContent}"
               Visibility="{Binding ElementName=txtName,Path=Validation.HasError,Converter=...}" />
</Grid>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X