BGA检测面板: 修复无检测结果时叠加层未清除、结果图不透明、窗口尺寸调整

This commit is contained in:
李伟
2026-04-29 10:34:40 +08:00
parent 36083993ea
commit 6eff24e27b
2 changed files with 193 additions and 155 deletions
@@ -221,17 +221,18 @@ namespace XplorePlane.ViewModels.ImageProcessing
private void ShowResultOnOverlay(BitmapSource resultBmp) private void ShowResultOnOverlay(BitmapSource resultBmp)
{ {
if (_canvas == null || resultBmp == null) return; if (_canvas == null) return;
// 移除旧的结果图层 // 移除旧的结果图层
RemoveResultOverlay(); RemoveResultOverlay();
if (resultBmp == null) return;
// 创建新的结果图层叠加到 canvas 上(插入到背景图之后、ROI之前) // 创建新的结果图层叠加到 canvas 上(插入到背景图之后、ROI之前)
_resultOverlayImage = new System.Windows.Controls.Image _resultOverlayImage = new System.Windows.Controls.Image
{ {
Source = resultBmp, Source = resultBmp,
IsHitTestVisible = false, IsHitTestVisible = false,
Opacity = 0.85,
Stretch = System.Windows.Media.Stretch.Fill Stretch = System.Windows.Media.Stretch.Fill
}; };
_resultOverlayImage.SetBinding(System.Windows.FrameworkElement.WidthProperty, _resultOverlayImage.SetBinding(System.Windows.FrameworkElement.WidthProperty,
@@ -2,174 +2,211 @@
x:Class="XplorePlane.Views.ImageProcessing.BgaDetectionPanel" x:Class="XplorePlane.Views.ImageProcessing.BgaDetectionPanel"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="BGA检测" Width="720" Height="520" Title="BGA检测" Width="840" Height="700"
ResizeMode="CanResize" WindowStartupLocation="CenterOwner" ResizeMode="CanResize" WindowStartupLocation="CenterOwner"
Topmost="True" ShowInTaskbar="False"> Topmost="True" ShowInTaskbar="False"
<Grid> Background="#F5F5F5" FontFamily="Microsoft YaHei UI">
<Window.Resources>
<!-- 统一按钮样式 -->
<Style x:Key="IconBtnStyle" TargetType="ButtonBase">
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ButtonBase">
<Border x:Name="Bd" Background="#FFFFFF" BorderBrush="#E0E0E0"
BorderThickness="1" CornerRadius="6" Padding="8,6">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#EAF2FB" />
<Setter TargetName="Bd" Property="BorderBrush" Value="#B0D4F1" />
</Trigger>
<DataTrigger Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#005FB8" />
<Setter TargetName="Bd" Property="BorderBrush" Value="#004C99" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- 卡片样式 -->
<Style x:Key="CardStyle" TargetType="Border">
<Setter Property="Background" Value="White" />
<Setter Property="BorderBrush" Value="#E8E8E8" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="8" />
<Setter Property="Padding" Value="12,10" />
<Setter Property="Margin" Value="0,0,0,8" />
</Style>
<!-- TextBox 样式 -->
<Style TargetType="TextBox">
<Setter Property="BorderBrush" Value="#D0D0D0" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Padding" Value="4,3" />
<Setter Property="FontSize" Value="11.5" />
<Style.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="4" />
</Style>
</Style.Resources>
</Style>
<!-- 参数标签 -->
<Style x:Key="ParamLabel" TargetType="TextBlock">
<Setter Property="FontSize" Value="11" />
<Setter Property="Foreground" Value="#555" />
<Setter Property="Margin" Value="0,0,0,3" />
</Style>
</Window.Resources>
<Grid Margin="8">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="280" /> <ColumnDefinition Width="285" />
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<!-- 左侧:参数面板 --> <!-- 左侧:参数面板 -->
<ScrollViewer Grid.Column="0" VerticalScrollBarVisibility="Auto"> <ScrollViewer Grid.Column="0" VerticalScrollBarVisibility="Auto" Margin="0,0,8,0">
<StackPanel Margin="10"> <StackPanel>
<WrapPanel Margin="0,0,0,6"> <!-- 工具栏 -->
<ToggleButton IsChecked="{Binding RoiEnabled}" Padding="8,4" Margin="0,0,6,0" Cursor="Hand" ToolTip="启用ROI区域"> <StackPanel Orientation="Horizontal" Margin="0,0,0,10">
<ToggleButton.Style> <ToggleButton IsChecked="{Binding RoiEnabled}" Style="{StaticResource IconBtnStyle}" ToolTip="启用ROI区域" Margin="0,0,6,0">
<Style TargetType="ToggleButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border x:Name="Bd" Background="#EEEEEE" BorderBrush="#CCCCCC"
BorderThickness="1" CornerRadius="3" Padding="10,4">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#0078D7" />
<Setter TargetName="Bd" Property="BorderBrush" Value="#005A9E" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#DDDDDD" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="IsChecked" Value="True" />
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="Background" Value="#006CBE" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ToggleButton.Style>
<Image Source="/Assets/Icons/polygon.png" Width="20" Height="20" /> <Image Source="/Assets/Icons/polygon.png" Width="20" Height="20" />
</ToggleButton> </ToggleButton>
<Button Padding="8,4" Margin="0,0,6,0" Command="{Binding ExecuteCommand}" ToolTip="执行检测" Cursor="Hand"> <Button Style="{StaticResource IconBtnStyle}" Command="{Binding ExecuteCommand}" ToolTip="执行检测" Margin="0,0,6,0">
<Button.Template>
<ControlTemplate TargetType="Button">
<Border x:Name="Bd" Background="#EEEEEE" BorderBrush="#CCCCCC"
BorderThickness="1" CornerRadius="3" Padding="10,4">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#DDDDDD" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#0078D7" />
<Setter TargetName="Bd" Property="BorderBrush" Value="#005A9E" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
<Image Source="/Assets/Icons/run32.png" Width="20" Height="20" /> <Image Source="/Assets/Icons/run32.png" Width="20" Height="20" />
</Button> </Button>
<Button Padding="8,4" Click="Close_Click" ToolTip="关闭" Cursor="Hand"> <Button Style="{StaticResource IconBtnStyle}" Click="Close_Click" ToolTip="关闭">
<Button.Template>
<ControlTemplate TargetType="Button">
<Border x:Name="Bd" Background="#EEEEEE" BorderBrush="#CCCCCC"
BorderThickness="1" CornerRadius="3" Padding="10,4">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#DDDDDD" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#0078D7" />
<Setter TargetName="Bd" Property="BorderBrush" Value="#005A9E" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
<Image Source="/Assets/Icons/ok.png" Width="20" Height="20" /> <Image Source="/Assets/Icons/ok.png" Width="20" Height="20" />
</Button> </Button>
</WrapPanel> </StackPanel>
<TextBlock Text="BGA定位参数" FontWeight="SemiBold" Margin="0,0,0,6" />
<TextBlock Text="焊球最小面积" FontSize="11" Margin="0,0,0,2" /> <!-- BGA定位参数卡片 -->
<DockPanel Margin="0,0,0,6"> <Border Style="{StaticResource CardStyle}">
<TextBox DockPanel.Dock="Right" Width="60" Text="{Binding BgaMinArea, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" /> <StackPanel>
<Slider Minimum="10" Maximum="100000" Value="{Binding BgaMinArea}" VerticalAlignment="Center" /> <TextBlock Text="BGA定位参数" FontWeight="SemiBold" FontSize="12" Margin="0,0,0,8" />
</DockPanel> <TextBlock Text="焊球最小面积" Style="{StaticResource ParamLabel}" />
<TextBlock Text="焊球最大面积" FontSize="11" Margin="0,0,0,2" /> <DockPanel Margin="0,0,0,6">
<DockPanel Margin="0,0,0,6"> <TextBox DockPanel.Dock="Right" Width="55" Text="{Binding BgaMinArea, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" />
<TextBox DockPanel.Dock="Right" Width="60" Text="{Binding BgaMaxArea, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" /> <Slider Minimum="10" Maximum="100000" Value="{Binding BgaMinArea}" VerticalAlignment="Center" />
<Slider Minimum="100" Maximum="10000000" Value="{Binding BgaMaxArea}" VerticalAlignment="Center" /> </DockPanel>
</DockPanel> <TextBlock Text="焊球最大面积" Style="{StaticResource ParamLabel}" />
<TextBlock Text="模糊核大小" FontSize="11" Margin="0,0,0,2" /> <DockPanel Margin="0,0,0,6">
<DockPanel Margin="0,0,0,6"> <TextBox DockPanel.Dock="Right" Width="55" Text="{Binding BgaMaxArea, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" />
<TextBox DockPanel.Dock="Right" Width="60" Text="{Binding BlurSize, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" /> <Slider Minimum="100" Maximum="10000000" Value="{Binding BgaMaxArea}" VerticalAlignment="Center" />
<Slider Minimum="1" Maximum="31" Value="{Binding BlurSize}" VerticalAlignment="Center" /> </DockPanel>
</DockPanel> <TextBlock Text="模糊核大小" Style="{StaticResource ParamLabel}" />
<TextBlock Text="圆度阈值" FontSize="11" Margin="0,0,0,2" /> <DockPanel Margin="0,0,0,6">
<DockPanel Margin="0,0,0,6"> <TextBox DockPanel.Dock="Right" Width="55" Text="{Binding BlurSize, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" />
<TextBox DockPanel.Dock="Right" Width="60" Text="{Binding Circularity, StringFormat=F2, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" /> <Slider Minimum="1" Maximum="31" Value="{Binding BlurSize}" VerticalAlignment="Center" />
<Slider Minimum="0" Maximum="1" Value="{Binding Circularity}" SmallChange="0.01" LargeChange="0.1" VerticalAlignment="Center" /> </DockPanel>
</DockPanel> <TextBlock Text="圆度阈值" Style="{StaticResource ParamLabel}" />
<Separator Margin="0,4" /> <DockPanel>
<TextBlock Text="气泡检测参数" FontWeight="SemiBold" Margin="0,4,0,6" /> <TextBox DockPanel.Dock="Right" Width="55" Text="{Binding Circularity, StringFormat=F2, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" />
<TextBlock Text="最小灰度阈值" FontSize="11" Margin="0,0,0,2" /> <Slider Minimum="0" Maximum="1" Value="{Binding Circularity}" SmallChange="0.01" LargeChange="0.1" VerticalAlignment="Center" />
<DockPanel Margin="0,0,0,6"> </DockPanel>
<TextBox DockPanel.Dock="Right" Width="60" Text="{Binding MinThreshold, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" /> </StackPanel>
<Slider Minimum="0" Maximum="255" Value="{Binding MinThreshold}" VerticalAlignment="Center" /> </Border>
</DockPanel>
<TextBlock Text="最大灰度阈值" FontSize="11" Margin="0,0,0,2" /> <!-- 气泡检测参数卡片 -->
<DockPanel Margin="0,0,0,6"> <Border Style="{StaticResource CardStyle}">
<TextBox DockPanel.Dock="Right" Width="60" Text="{Binding MaxThreshold, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" /> <StackPanel>
<Slider Minimum="0" Maximum="255" Value="{Binding MaxThreshold}" VerticalAlignment="Center" /> <TextBlock Text="气泡检测参数" FontWeight="SemiBold" FontSize="12" Margin="0,0,0,8" />
</DockPanel> <TextBlock Text="最小灰度阈值" Style="{StaticResource ParamLabel}" />
<TextBlock Text="最小气泡面积" FontSize="11" Margin="0,0,0,2" /> <DockPanel Margin="0,0,0,6">
<DockPanel Margin="0,0,0,6"> <TextBox DockPanel.Dock="Right" Width="55" Text="{Binding MinThreshold, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" />
<TextBox DockPanel.Dock="Right" Width="60" Text="{Binding MinVoidArea, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" /> <Slider Minimum="0" Maximum="255" Value="{Binding MinThreshold}" VerticalAlignment="Center" />
<Slider Minimum="1" Maximum="10000" Value="{Binding MinVoidArea}" VerticalAlignment="Center" /> </DockPanel>
</DockPanel> <TextBlock Text="最大灰度阈值" Style="{StaticResource ParamLabel}" />
<TextBlock Text="VoidLimit(%)" FontSize="11" Margin="0,0,0,2" /> <DockPanel Margin="0,0,0,6">
<DockPanel Margin="0,0,0,6"> <TextBox DockPanel.Dock="Right" Width="55" Text="{Binding MaxThreshold, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" />
<TextBox DockPanel.Dock="Right" Width="60" Text="{Binding VoidLimit, StringFormat=F1, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" /> <Slider Minimum="0" Maximum="255" Value="{Binding MaxThreshold}" VerticalAlignment="Center" />
<Slider Minimum="0" Maximum="100" Value="{Binding VoidLimit}" VerticalAlignment="Center" /> </DockPanel>
</DockPanel> <TextBlock Text="最小气泡面积" Style="{StaticResource ParamLabel}" />
<TextBlock Text="最大单气泡限值(%)" FontSize="11" Margin="0,0,0,2" /> <DockPanel Margin="0,0,0,6">
<DockPanel Margin="0,0,0,6"> <TextBox DockPanel.Dock="Right" Width="55" Text="{Binding MinVoidArea, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" />
<TextBox DockPanel.Dock="Right" Width="60" Text="{Binding MaxSingleVoidLimit, StringFormat=F1, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" /> <Slider Minimum="1" Maximum="10000" Value="{Binding MinVoidArea}" VerticalAlignment="Center" />
<Slider Minimum="0" Maximum="100" Value="{Binding MaxSingleVoidLimit}" VerticalAlignment="Center" /> </DockPanel>
</DockPanel> <TextBlock Text="VoidLimit(%)" Style="{StaticResource ParamLabel}" />
<Separator Margin="0,4" /> <DockPanel Margin="0,0,0,6">
<TextBlock Text="{Binding ResultText}" FontSize="14" FontWeight="SemiBold" Margin="0,4,0,8" /> <TextBox DockPanel.Dock="Right" Width="55" Text="{Binding VoidLimit, StringFormat=F1, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" />
<Slider Minimum="0" Maximum="100" Value="{Binding VoidLimit}" VerticalAlignment="Center" />
</DockPanel>
<TextBlock Text="最大单气泡限值(%)" Style="{StaticResource ParamLabel}" />
<DockPanel>
<TextBox DockPanel.Dock="Right" Width="55" Text="{Binding MaxSingleVoidLimit, StringFormat=F1, UpdateSourceTrigger=PropertyChanged}" VerticalContentAlignment="Center" Margin="6,0,0,0" />
<Slider Minimum="0" Maximum="100" Value="{Binding MaxSingleVoidLimit}" VerticalAlignment="Center" />
</DockPanel>
</StackPanel>
</Border>
<!-- 结果摘要 -->
<Border Style="{StaticResource CardStyle}">
<TextBlock Text="{Binding ResultText}" FontSize="13" FontWeight="SemiBold" Foreground="#333" />
</Border>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
<!-- 右侧:结果表格 --> <!-- 右侧:结果表格 -->
<GroupBox Grid.Column="1" Header="检测结果" Margin="4"> <Border Grid.Column="1" Background="White" BorderBrush="#E8E8E8" BorderThickness="1" CornerRadius="8" Padding="0">
<DataGrid ItemsSource="{Binding Results}" <Grid>
AutoGenerateColumns="False" IsReadOnly="True" <Grid.RowDefinitions>
HeadersVisibility="Column" GridLinesVisibility="Horizontal" <RowDefinition Height="Auto" />
BorderThickness="0" Background="White" <RowDefinition Height="*" />
VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> </Grid.RowDefinitions>
<DataGrid.RowStyle> <TextBlock Grid.Row="0" Text="检测结果" FontWeight="SemiBold" FontSize="12" Margin="12,10,0,6" Foreground="#333" />
<Style TargetType="DataGridRow"> <DataGrid Grid.Row="1" ItemsSource="{Binding Results}"
<Style.Triggers> AutoGenerateColumns="False" IsReadOnly="True"
<DataTrigger Binding="{Binding Classification}" Value="FAIL"> HeadersVisibility="Column" GridLinesVisibility="None"
<Setter Property="Background" Value="#FFDDDD" /> BorderThickness="0" Background="White"
</DataTrigger> RowHeight="30" FontSize="11.5"
</Style.Triggers> VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
</Style> <DataGrid.ColumnHeaderStyle>
</DataGrid.RowStyle> <Style TargetType="DataGridColumnHeader">
<DataGrid.Columns> <Setter Property="Background" Value="#F8F9FA" />
<DataGridTextColumn Header="#" Binding="{Binding Index}" Width="30" /> <Setter Property="Foreground" Value="#666" />
<DataGridTextColumn Header="判定" Binding="{Binding Classification}" Width="50" /> <Setter Property="FontSize" Value="11" />
<DataGridTextColumn Header="中心X" Binding="{Binding CenterX}" Width="65" /> <Setter Property="Padding" Value="8,6" />
<DataGridTextColumn Header="中心Y" Binding="{Binding CenterY}" Width="65" /> <Setter Property="BorderBrush" Value="#EEE" />
<DataGridTextColumn Header="焊球面积" Binding="{Binding BgaArea}" Width="70" /> <Setter Property="BorderThickness" Value="0,0,0,1" />
<DataGridTextColumn Header="空隙率" Binding="{Binding VoidRate}" Width="65" /> </Style>
<DataGridTextColumn Header="最大气泡" Binding="{Binding MaxVoidRate}" Width="65" /> </DataGrid.ColumnHeaderStyle>
<DataGridTextColumn Header="气泡数" Binding="{Binding VoidCount}" Width="55" /> <DataGrid.CellStyle>
<DataGridTextColumn Header="圆度" Binding="{Binding Circularity}" Width="55" /> <Style TargetType="DataGridCell">
</DataGrid.Columns> <Setter Property="Padding" Value="8,4" />
</DataGrid> <Setter Property="BorderThickness" Value="0" />
</GroupBox> <Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background" Value="White" />
<Style.Triggers>
<Trigger Property="AlternationIndex" Value="1">
<Setter Property="Background" Value="#FAFBFC" />
</Trigger>
<DataTrigger Binding="{Binding Classification}" Value="FAIL">
<Setter Property="Background" Value="#FFF0F0" />
</DataTrigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#EDF4FC" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="#" Binding="{Binding Index}" Width="32" />
<DataGridTextColumn Header="判定" Binding="{Binding Classification}" Width="50" />
<DataGridTextColumn Header="中心X" Binding="{Binding CenterX}" Width="60" />
<DataGridTextColumn Header="中心Y" Binding="{Binding CenterY}" Width="60" />
<DataGridTextColumn Header="焊球面积" Binding="{Binding BgaArea}" Width="68" />
<DataGridTextColumn Header="空隙率" Binding="{Binding VoidRate}" Width="60" />
<DataGridTextColumn Header="最大气泡" Binding="{Binding MaxVoidRate}" Width="65" />
<DataGridTextColumn Header="气泡数" Binding="{Binding VoidCount}" Width="52" />
<DataGridTextColumn Header="圆度" Binding="{Binding Circularity}" Width="52" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Border>
</Grid> </Grid>
</Window> </Window>