WPF验证控制模板重叠

时间:2011-06-29 05:25:50

标签: wpf validation controltemplate adorner

我有一个带有控件模板的用户控件来显示验证错误,验证模板:

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

我似乎无法绕过一个看起来像这样的令人恼火的问题:

validation

我一直试图在用户控件上使用边距,在模板上还有一些Height = Auto等,但所有这些并没有真正帮助。任何人的想法?

如果这有助于主要用户控件(嵌套验证的那个)位于带有AdornerDecorator的TabItem中。

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:4)

我想这是因为您的错误消息在AdornerLayer上,而且与您的控件没有参与相同的布局。 MSDN says“装饰者的渲染独立于装饰者所绑定的UIElement的渲染。”这就是为什么消息只是置于一切之上。

您可以将错误文本放入原始模板中,根据Validation.HasError隐藏它并将其包含在布局过程中。

但是,如果发生验证错误,更改控件的布局可能不是最好的方法。您可以考虑在工具提示中提供其他信息。

答案 1 :(得分:1)

或者,您可以将错误消息TextBlock放在TextBox旁边,并将其Text属性绑定到TextBox的ErrorContent,而不是使用ControlTemplate。

public void checkuser(){
    EditText player1 = (EditText)findViewById(R.id.editText2);
    EditText player2 = (EditText)findViewById(R.id.editText);
    EditText player3 = (EditText)findViewById(R.id.editText4);
    EditText player4 = (EditText)findViewById(R.id.editText3);
    String f = player1.getText().toString();
    String f1 = player2.getText().toString();
    String f2 = player3.getText().toString();
    String f3 = player4.getText().toString();

    if ((f.trim().equals("")) && (f1.trim().equals("")) && (f2.trim().equals("") && (f3.trim().equals("")))){
        Intent i = new Intent(getApplicationContext(),Game_Launch_withoutplayer.class);
        startActivity(i);
    }
    else{
        Intent in = new Intent(getApplicationContext(),Game_Launch.class);

        in.putExtra("player1", player1.getText().toString());
        in.putExtra("player2", player2.getText().toString());
        in.putExtra("player3", player3.getText().toString());
        in.putExtra("player4", player4.getText().toString());
        startActivity(in);
    }
}