WPF无法从UserControl中删除红色边框

lyr7nygr  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(153)

我构建了一个简单的登录页面,当检测到无效输入时,会在用户控件周围绘制一个红色边框。x1c 0d1x
下面是我的布局代码:

<UserControl x:Class="WPFTest.UI.Views.EmptyLayout"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WPFTest.UI.Views"
             xmlns:vm="clr-namespace:WPFTest.UI.ViewModels"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800"
             d:DataContext="{d:DesignInstance Type=vm:EmptyLayoutViewModel}"
             Background="White"
             >
    <Grid Margin="20">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" FontSize="20" FontWeight="Bold">Test Sales Estimator</TextBlock>
    <ContentControl Content="{Binding Layout}" Grid.Row="1">
        <ContentControl.Resources>
                <DataTemplate DataType="{x:Type vm:LoginViewModel}">
                    <local:LoginView/>
                </DataTemplate>
            </ContentControl.Resources>
    </ContentControl>
    </Grid>
</UserControl>

下面是登录视图:

<UserControl
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WPFTest.UI.Views" xmlns:viewmodels="clr-namespace:WPFTest.UI.ViewModels"
             xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" x:Class="WPFTest.UI.Views.LoginView"
             mc:Ignorable="d"
             d:DesignHeight="450" d:DesignWidth="800"
             Background="White"
             d:DataContext="{d:DesignInstance Type={x:Type viewmodels:LoginViewModel}}"
             Margin="20 0 0 0"
             Padding="10"
             >   
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="150" />
        </Grid.ColumnDefinitions>

        <StackPanel Grid.Row="2" Margin="0 50 0 0">
            <TextBlock Text="Welcome" FontSize="17" Grid.Row="1" Margin="0 0 0 20" Height="50"/>
            <StackPanel>
                <TextBlock Text="Username" />
                <TextBox Text="{Binding Username}"/>
            </StackPanel>

            <StackPanel Grid.Row="2" Margin="0 10 0 0">
                <TextBlock Text="Password"  />
                <PasswordBox x:Name="Password" PasswordChanged="PasswordBox_PasswordChanged" >
                </PasswordBox>
            </StackPanel>
            <Button
            Grid.Row="2"
            Margin="0 20 0 0"
            Padding="5 2"
            HorizontalAlignment="Left"
            Command="{Binding HandleLoginCommand}"
            IsEnabled="{Binding CanLogin}"
            Content="Login">

            </Button>
        </StackPanel>
    </Grid>
</UserControl>

我已尝试使用以下模板覆盖边框:

<Style TargetType="views:LoginView">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="BorderBrush" Value="Blue"/>
                <Setter Property="BorderThickness" Value="1"/>
            </Trigger>
        </Style.Triggers>
    </Style>

但是边框仍然是红色的。我还尝试将模板上的目标更改为UserControl和ContentControl之类的内容。我还尝试将UserControl和布局用户控件内的元素上的Validation.ErrorTemplate属性设置为{x:Null}。
对于LoginViewModel,我使用CommunityToolkit.MvvmObservableValidator作为我的基类,因此它处理验证逻辑,下面是我的Username属性。

private string _username;
        [Required]
        [MinLength(4)]
        public string Username
        {
            get { return _username; }
            set { 
                SetProperty(ref _username, value, true);
                OnPropertyChanged(nameof(HandleLoginCommand));
            }
        }
2cmtqfgy

2cmtqfgy1#

边框来自内容控件。
设置验证。错误模板="{x:Null}”。
你可以只使用一个contentpresenter。

<ContentPresenter Content="{Binding Layout}"  Grid.Row="1"
                      Validation.ErrorTemplate="{x:Null}">
        <ContentPresenter.Resources>
            <DataTemplate DataType="{x:Type local:LoginViewModel}">
                <local:LoginView/>
            </DataTemplate>
        </ContentPresenter.Resources>
    </ContentPresenter>

我有一个简化的布局来探索这一点,但是当我进行更改时,外部红色边框没有出现。

blmhpbnm

blmhpbnm2#

验证修饰不使用控件的Border(Thcikness/Brush)。它是在单独的AdornerLayer中绘制的单独的Visual。若要修改其外观,应传递ErrorTemplate的专用模板,如下所示:(TextBox的示例)

<Style TargetType="TextBox">
  <Setter Property="Validation.ErrorTemplate">
    <Setter.Value>
      <ControlTemplate>
        <Grid>
          <Border BorderBrush="Yellow" BorderThickness="3">
            <AdornedElementPlaceholder x:Name="AdornedElementPlaceholder" />
          </Border>
        </Grid>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

要真正删除边框,请尝试将Validation.ErrorTemplate设置为{x:Null}

相关问题