基于两个属性(IsFocused、IsVisible)显示弹出窗口

Show popup based on two properties (IsFocused, IsVisible)

我有弹出错误消息框,文本框获得焦点后它会打开。

打开对话框 window 时的问题,如果您单击关闭按钮 (关闭时我隐藏 window) 错误消息仍然可见.我试图添加触发器来检查可见性,但它没有用。有什么想法吗?

XAML:

<ControlTemplate x:Key="errorToolTipTemplate">
    <Grid>
        <Border BorderBrush="#EF5B7C" BorderThickness="1" Background="#EF5B7C" Opacity="0.4" IsHitTestVisible="False" x:Name="errorBorder" />
        <AdornedElementPlaceholder x:Name="placeholder" />
        <Popup x:Name="popup" AllowsTransparency="True"
               PopupAnimation="Fade"
               Placement="Right"
               VerticalOffset="-3"
               PlacementTarget="{Binding ElementName=errorBorder}"
               IsOpen="{Binding ElementName=placeholder, Path=AdornedElement.IsFocused, Mode=OneWay}">
            <Popup.Style>
                <Style TargetType="{x:Type Popup}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=errorBorder, Path=IsVisible, Mode=OneWay}" Value="False">
                            <Setter Property="IsOpen" Value="False" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Popup.Style>
            <DockPanel>
                <Polygon VerticalAlignment="Center"
                         Points="0,5 5,0 5,10"
                         Fill="#EF5B7C"
                         Stretch="Fill" />
                <Border Background="White" BorderBrush="#EF5B7C" BorderThickness="1" CornerRadius="4" Padding="2">
                    <DockPanel>
                        <Image Height="20" Width="20" VerticalAlignment="Center" Source="Images/C04_32.png" />
                        <TextBlock HorizontalAlignment="Center"
                                   VerticalAlignment="Center"
                                   Foreground="{StaticResource errorBrush}"
                                   FontWeight="Bold" Margin="2,0,0,0"
                                   Text="{Binding ElementName=placeholder, Path=AdornedElement.ToolTip, Mode=OneWay}" />
                    </DockPanel>
                </Border>
            </DockPanel>
        </Popup>
    </Grid>
</ControlTemplate>

<!--Textbox style-->
<Style TargetType="{x:Type TextBox}">
    <Setter Property="Validation.ErrorTemplate" Value="{DynamicResource errorToolTipTemplate}" />
</Style>

通过为 ControlTemplate 添加 triggers 解决了这个问题。 我添加了 SourceTarget 作为 adornerTargetName 作为弹出窗口的触发器,并根据其他控件的可见性更改了 IsOpen 属性。

<ControlTemplate x:Key="errorToolTipTemplate">
    <Grid>
        <Border BorderBrush="#EF5B7C" BorderThickness="1" Background="#EF5B7C" Opacity="0.4" IsHitTestVisible="False" x:Name="errorBorder" />
        <AdornedElementPlaceholder x:Name="placeholder" />
        <Popup x:Name="popup" AllowsTransparency="True"
               PopupAnimation="Fade"
               Placement="Right"
               VerticalOffset="-3"
               PlacementTarget="{Binding ElementName=errorBorder}"
               IsOpen="{Binding ElementName=placeholder, Path=AdornedElement.IsFocused, Mode=OneWay}">
            <DockPanel>
                <Polygon VerticalAlignment="Center"
                         Points="0,5 5,0 5,10"
                         Fill="#EF5B7C"
                         Stretch="Fill" />
                <Border Background="White" BorderBrush="#EF5B7C" BorderThickness="1" CornerRadius="4" Padding="2">
                    <DockPanel>
                        <Image Height="20" Width="20" VerticalAlignment="Center" Source="Images/C04_32.png" />
                        <TextBlock HorizontalAlignment="Center"
                                   VerticalAlignment="Center"
                                   Foreground="{StaticResource errorBrush}"
                                   FontWeight="Bold" Margin="2,0,0,0"
                                   Text="{Binding ElementName=placeholder, Path=AdornedElement.ToolTip, Mode=OneWay}" />
                    </DockPanel>
                </Border>
            </DockPanel>
        </Popup>
    </Grid>
    <ControlTemplate.Triggers>
        <Trigger SourceName="placeholder" Property="IsVisible" Value="False">
            <Setter TargetName="popup" Property="IsOpen" Value="False" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>