具有为窗口定义的模板样式时,INotifyDataErrorInfo不会触发文本框样式

问题描述 投票:0回答:1

如果我从窗口中删除样式属性,则文本框周围会出现红色边框。但是,如果我在窗口上定义了样式,那么它不会显示?为什么?

我发现“问题”是因为Template属性是在窗口样式中定义的。当我删除该部分时,将在应用程序的其他部分显示验证样式。

这是我的橱窗风格:

 <Style TargetType="{x:Type Window}" x:Key="LoginWindowStyle"  >

        <Setter Property="Width" Value="500"/>
        <Setter Property="Height" Value="700"/>
        <Setter Property="ResizeMode" Value="CanResize"/>
        <Setter Property="WindowStyle" Value="None"/>
        <Setter Property="AllowsTransparency" Value="True"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">

                    <Border Background="White" CornerRadius="10">
                        <Border.Effect>
                            <DropShadowEffect ShadowDepth="5" Opacity="0.5"></DropShadowEffect>
                        </Border.Effect>
                        <Grid  Background="{TemplateBinding Background}">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="40"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <StackPanel Height="40" >
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition></ColumnDefinition>

                                        <ColumnDefinition Width="auto" ></ColumnDefinition>

                                    </Grid.ColumnDefinitions>

                                <TextBlock Grid.Column="0" Text="Login" FontSize="15" Margin="30 8 0 0" />
                                    <StackPanel Grid.Column="1" Orientation="Horizontal"  WindowChrome.IsHitTestVisibleInChrome="True">
                                        <Button Style="{DynamicResource WindowTopButtons}" Command="{Binding Minimize}"  Width="40" Height="40">
                                            <TextBlock>-</TextBlock>
                                        </Button>
                                        <Button Style="{DynamicResource WindowTopButtons}" Command="{Binding Maximize}" Margin="1 0 1 0"  Width="40" Height="40">
                                            <TextBlock>[]</TextBlock>
                                        </Button>
                                        <Button Style="{DynamicResource CloseButton}" Command="{Binding Close}"  Width="40" Height="40"  >
                                            <TextBlock>X</TextBlock>
                                        </Button>
                                    </StackPanel>
                                </Grid>

                            </StackPanel>

                            <ContentPresenter  Grid.Row="1"/>


                        </Grid>
                    </Border>


                </ControlTemplate>
            </Setter.Value>
        </Setter>

    </Style>

这是我的登录窗口:

 <Window x:Class="xxx.LoginWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:xxx.ViewModels"
  d:DataContext="{d:DesignInstance local:LoginViewModel,IsDesignTimeCreatable=True}"
    x:Name="LoginWindowName"
    mc:Ignorable="d"     
   WindowState="{Binding CurrentWindowState}"
    Style="{StaticResource LoginWindowStyle}"
    MinWidth="220"
    MinHeight="200"
    WindowStartupLocation="CenterScreen"
    Title="LoginWindow" >
<Window.Resources>
    <BooleanToVisibilityConverter x:Key="bvc" />
</Window.Resources>
<WindowChrome.WindowChrome >
    <WindowChrome ResizeBorderThickness="3" CaptionHeight="40">

    </WindowChrome>
</WindowChrome.WindowChrome>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="1*"/>
        <RowDefinition Height="2*"/>
    </Grid.RowDefinitions>
    <StackPanel  Grid.Row="0" Background="{StaticResource LoginGradient}" Margin="0,-5,0,0" >


        <TextBlock Text="Login"
                   VerticalAlignment="Bottom"
                   HorizontalAlignment="Center"
                   Foreground="White" FontSize="50"
                  ></TextBlock>

    </StackPanel>
    <StackPanel Grid.Row="1" >
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*"></ColumnDefinition>
                <ColumnDefinition Width="2*"></ColumnDefinition>
                <ColumnDefinition Width="1*"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <StackPanel Grid.Column="1">
                <StackPanel.Resources>
                    <Style  TargetType="{x:Type TextBox}"  BasedOn="{StaticResource ValidatedTextbox}">
                        <Setter Property="Background" Value="Red"></Setter>
                    </Style>
                </StackPanel.Resources>
                <TextBox  Text="{Binding UserName,Mode=TwoWay,
                    UpdateSourceTrigger=PropertyChanged,
                    ValidatesOnDataErrors=True,NotifyOnSourceUpdated=True}"
                         Background="LightGray" Height="30" Margin="0 0 0 10"/>

                <TextBox  Style="{StaticResource ValidatedTextbox}"  Text="{Binding Password,Mode=TwoWay,
                    UpdateSourceTrigger=PropertyChanged,
                    NotifyOnValidationError=True}"
                         Background="LightGray" Height="30"  Margin="0 0 0 10"/>
                <Button Command="{Binding LoginCommand}" CommandParameter="{Binding ElementName=LoginWindowName}" Background="LightGray" Height="30">Prijavi se</Button>
                <TextBlock Foreground="Red" Visibility="{Binding IncorrectLogin,Converter={StaticResource bvc}}">Your username and password combination is incorrect</TextBlock>
            </StackPanel>
        </Grid>
    </StackPanel>
</Grid>

wpf wpf-controls wpf-style inotifydataerrorinfo
1个回答
0
投票

Window样式,您需要用ContentPresenter包裹AdornerDecorator。验证样式实现为Adorner,因此,如果没有AdornerDecorator,则不会显示它们。

<AdornerDecorator>
    <ContentPresenter />
</AdornerDecorator>
© www.soinside.com 2019 - 2024. All rights reserved.