窗体管理对象

public class WindowManager
{
    static Dictionary<string, WindowStruct> _regWindows = new Dictionary<string, WindowStruct>();
    public static void Register<T>(string name, Window owner = null)
    {
        if (!_regWindows.ContainsKey(name))
            _regWindows.Add(name, new WindowStruct { WindowType = typeof(T), Owner = owner });
    }
    public static bool ShowDialog(string name, object vm)
    {
        if (_regWindows.ContainsKey(name))
        {
            Type type = _regWindows[name].WindowType;

            var win = (Window)Activator.CreateInstance(type);
            win.Owner = _regWindows[name].Owner;
            win.DataContext = vm;
            return win.ShowDialog() == true;
        }
        return false;
    }
}

public class WindowStruct
{
    public Type WindowType { get; set; }
    public Window Owner { get; set; }
}

父窗体注册子窗体

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = new MainViewModel();

        WindowManager.Register<DeviceEditWindow>("DeviceEditWindow", this);
    }

    private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        this.DragMove();
    }
}

子窗体包含到父窗体

<Window x:Class="Zhaoxi.HostComputer.Views.DeviceEditWindow"
        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:Zhaoxi.HostComputer.Views"
        xmlns:sys="clr-namespace:System;assembly=System.Runtime"
        mc:Ignorable="d" UseLayoutRounding="True"
        FontFamily="Microsoft YaHei" FontWeight="ExtraLight" Foreground="#333"
        WindowStyle="None" AllowsTransparency="True"  WindowStartupLocation="CenterOwner" Background="Transparent"
        Title="设备信息维护" Height="550" Width="800">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/Zhaoxi.HostComputer;component/Assets/Styles/ComboBoxStyle.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/Zhaoxi.HostComputer;component/Assets/Styles/LeftTabControlStyle.xaml"/>
                <ResourceDictionary>
                    <Style TargetType="Button" x:Key="ControlButtonStyle">
                        <Setter Property="FontSize" Value="12"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="Button">
                                    <Grid Background="Transparent" Height="30" Width="45" Name="back">
                                        <Border Name="hover" Background="{TemplateBinding Background}" Visibility="Collapsed"/>
                                        <TextBlock Text="{TemplateBinding Content}" FontFamily="{StaticResource iconfont}" 
                                       VerticalAlignment="Center" HorizontalAlignment="Center" Name="txt"
                                       Foreground="White"/>
                                    </Grid>
                                    <ControlTemplate.Triggers>
                                        <Trigger Property="IsMouseOver" Value="True">
                                            <Setter Property="Visibility" Value="Visible" TargetName="hover"/>

                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                        <Style.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Foreground" Value="{Binding Tag,RelativeSource={RelativeSource Mode=Self}}"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>

                    <ControlTemplate TargetType="Button" x:Key="AddButtonTemplate">
                        <Border Background="{TemplateBinding Background}" CornerRadius="3">
                            <Border Name="back">
                                <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"
                                  Content="{TemplateBinding Content}" TextBlock.Foreground="White"/>
                            </Border>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="#22000000" TargetName="back"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>

                    <x:Array Type="sys:String" x:Key="datas">
                        <sys:String>1</sys:String>
                        <sys:String>2</sys:String>
                        <sys:String>3</sys:String>
                        <sys:String>4</sys:String>
                        <sys:String>5</sys:String>
                        <sys:String>6</sys:String>
                        <sys:String>7</sys:String>
                    </x:Array>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Border Margin="5" Background="#FFF6F7FC">
        <Border.Effect>
            <DropShadowEffect BlurRadius="8" Opacity="0.2" Direction="0" Color="Gray" ShadowDepth="0"/>
        </Border.Effect>
        <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown">
            <Grid.RowDefinitions>
                <RowDefinition Height="80"/>
                <!--<RowDefinition Height="40"/>
                <RowDefinition Height="40"/>
                <RowDefinition Height="40"/>
                <RowDefinition Height="40"/>
                <RowDefinition Height="10"/>
                <RowDefinition Height="40"/>-->
                <RowDefinition/>
                <!--<RowDefinition Height="50"/>-->
            </Grid.RowDefinitions>
            <Border Background="#FF3269DE"/>
            <StackPanel VerticalAlignment="Center" HorizontalAlignment="Left">
                <TextBlock Text="设备信息编辑" Foreground="White" VerticalAlignment="Center" Margin="15,0"/>
                <TextBlock Text="{Binding Name}" Foreground="White" VerticalAlignment="Center" Margin="15,20,0,5"
                           FontSize="18"/>
            </StackPanel>

            <Button Content="&#xe653;" Style="{StaticResource ControlButtonStyle}" Background="#11000000" Tag="#333" Height="33" VerticalAlignment="Top"
                    HorizontalAlignment="Right" Click="Button_Click"/>

            <TabControl Grid.Row="1" BorderThickness="0" Margin="0,20">
                <TabItem Header="通信配置">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="40"/>
                            <RowDefinition Height="40"/>
                            <RowDefinition Height="40"/>
                            <RowDefinition Height="40"/>
                            <RowDefinition Height="40"/>
                            <RowDefinition Height="40"/>
                            <RowDefinition Height="40"/>
                            <RowDefinition/>
                            <RowDefinition Height="50"/>
                        </Grid.RowDefinitions>
                        <StackPanel Orientation="Horizontal" Margin="30,0" VerticalAlignment="Center">
                            <TextBlock Text="通信方式" Margin="20,0"/>
                            <RadioButton Content="串口" IsChecked="True" Click="RadioButton_Checked"/>
                            <RadioButton Content="网口" Margin="15,0" Click="RadioButton_Checked"/>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal" Grid.Row="1" Margin="30,0" VerticalAlignment="Center">
                            <TextBlock Text="通信参数" Margin="20,0" VerticalAlignment="Center"/>
                            <ComboBox SelectedIndex="0" Width="80" x:Name="cb1">
                                <ComboBoxItem Content="COM1"/>
                                <ComboBoxItem Content="COM2"/>
                            </ComboBox>
                            <ComboBox SelectedIndex="1" Width="80" Margin="7,0" x:Name="cb2">
                                <ComboBoxItem Content="4800"/>
                                <ComboBoxItem Content="9600"/>
                                <ComboBoxItem Content="19200"/>
                            </ComboBox>
                            <ComboBox SelectedIndex="1" Width="50" x:Name="cb3">
                                <ComboBoxItem Content="7"/>
                                <ComboBoxItem Content="8"/>
                            </ComboBox>
                            <ComboBox SelectedIndex="0" Width="70" Margin="7,0" x:Name="cb4">
                                <ComboBoxItem Content="None"/>
                                <ComboBoxItem Content="Odd"/>
                                <ComboBoxItem Content="Even"/>
                            </ComboBox>
                            <ComboBox SelectedIndex="0" Width="70" x:Name="cb5">
                                <ComboBoxItem Content="One"/>
                                <ComboBoxItem Content="Two"/>
                            </ComboBox>
                            <TextBox Text="192.168.2.1" VerticalContentAlignment="Center" Width="100" x:Name="tb1"
                         Visibility="Collapsed" Height="26"/>
                            <TextBox Text="102" VerticalContentAlignment="Center" Width="50" Margin="7,0" x:Name="tb2"
                         Visibility="Collapsed"/>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal" Grid.Row="2" Margin="30,0" VerticalAlignment="Center">
                            <TextBlock Text="通信协议" Margin="20,0" VerticalAlignment="Center"/>
                            <ComboBox SelectedIndex="0" Width="167">
                                <ComboBoxItem Content="ModbusRTU"/>
                                <ComboBoxItem Content="ModbusASCII"/>
                                <ComboBoxItem Content="ModbusTCP"/>
                                <ComboBoxItem Content="S7-200SMART"/>
                                <ComboBoxItem Content="S7-1500"/>
                            </ComboBox>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal" Grid.Row="3" Margin="30,0" VerticalAlignment="Center">
                            <TextBlock Text="设备站号" Margin="20,0" VerticalAlignment="Center"/>
                            <TextBox Text="01" Height="23" VerticalContentAlignment="Center" Width="167"/>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal" Grid.Row="4" Margin="30,0" VerticalAlignment="Center">
                            <TextBlock Text="机  架  号" Margin="19,0" VerticalAlignment="Center"/>
                            <TextBox Text="00" Height="23" VerticalContentAlignment="Center" Width="167"/>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal" Grid.Row="5" Margin="30,0" VerticalAlignment="Center">
                            <TextBlock Text="插  槽  号" Margin="19,0" VerticalAlignment="Center"/>
                            <TextBox Text="01" Height="23" VerticalContentAlignment="Center" Width="167"/>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal" Grid.Row="6" Margin="30,0" VerticalAlignment="Center">
                            <TextBlock Text="刷新频率" Margin="20,0" VerticalAlignment="Center"/>
                            <ComboBox SelectedIndex="2" Width="167">
                                <ComboBoxItem Content="10ms"/>
                                <ComboBoxItem Content="50ms"/>
                                <ComboBoxItem Content="500ms"/>
                                <ComboBoxItem Content="1000ms"/>
                                <ComboBoxItem Content="2000ms"/>
                            </ComboBox>
                        </StackPanel>

                        <StackPanel Orientation="Horizontal" Grid.Row="8" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="50,0">
                            <Button Content="保存" Template="{StaticResource AddButtonTemplate}" Width="75" Height="28" Margin="5,0"
                        Background="#FF3269DE"/>
                            <Button Content="退出" Template="{StaticResource AddButtonTemplate}" Width="55" Height="28"
                        Background="#999" Visibility="Collapsed"/>
                        </StackPanel>
                    </Grid>
                </TabItem>
                <TabItem Header="监控点位">
                    <Grid Grid.Row="7">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="30"/>
                            <RowDefinition/>
                            <RowDefinition Height="50"/>
                        </Grid.RowDefinitions>
                        <Grid Background="#EEE" Margin="10,0">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="45"/>
                                <ColumnDefinition/>
                                <ColumnDefinition Width="80"/>
                                <ColumnDefinition Width="60"/>
                                <ColumnDefinition Width="60"/>
                                <ColumnDefinition Width="100"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Text="序号" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                            <TextBlock Text="监控标签" VerticalAlignment="Center" HorizontalAlignment="Left" Grid.Column="1"/>
                            <TextBlock Text="寄存器地址" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="2"/>
                            <TextBlock Text="单位" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="3"/>
                            <TextBlock Text="数据类型" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="4"/>
                            <TextBlock Text="操作" VerticalAlignment="Center" HorizontalAlignment="Center" Grid.Column="5"/>
                        </Grid>
                        <ItemsControl Grid.Row="1" ItemsSource="{Binding Source={StaticResource datas}}" Margin="10,0">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Grid Background="Transparent" Height="30">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="45"/>
                                            <ColumnDefinition/>
                                            <ColumnDefinition Width="80"/>
                                            <ColumnDefinition Width="60"/>
                                            <ColumnDefinition Width="60"/>
                                            <ColumnDefinition Width="100"/>
                                        </Grid.ColumnDefinitions>
                                        <TextBlock Text="{Binding}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                                        <TextBlock Text="电源电压" Grid.Column="1" VerticalAlignment="Center" />
                                        <TextBlock Text="VW100" Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                                        <TextBlock Text="kv" Grid.Column="3" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                                        <TextBlock Text="ushort" Grid.Column="4" VerticalAlignment="Center" HorizontalAlignment="Center"/>

                                        <TextBlock Grid.Column="5" VerticalAlignment="Center" HorizontalAlignment="Center">
                                    <Hyperlink>编辑</Hyperlink>
                                    <Hyperlink>删除</Hyperlink>
                                        </TextBlock>
                                    </Grid>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>

                        <Button Content="添加点位配置" Grid.Row="8" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0"
                    Height="28" Width="120" Background="#FF3269DE"
                    Template="{StaticResource AddButtonTemplate}"/>
                    </Grid>

                </TabItem>
            </TabControl>




            <!--<Border Grid.Row="2" Background="White"/>-->
           

        </Grid>
    </Border>
</Window>
/// <summary>
    /// DeviceEditWindow.xaml 的交互逻辑
    /// </summary>
    public partial class DeviceEditWindow : Window
    {
        public DeviceEditWindow()
        {
            InitializeComponent();
        }

        private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            this.DragMove();
        }

        private void RadioButton_Checked(object sender, RoutedEventArgs e)
        {
            if ((sender as RadioButton).Content.ToString() == "串口")
            {
                this.cb1.Visibility = Visibility.Visible;
                this.cb2.Visibility = Visibility.Visible;
                this.cb3.Visibility = Visibility.Visible;
                this.cb4.Visibility = Visibility.Visible;
                this.cb5.Visibility = Visibility.Visible;
                this.tb1.Visibility = Visibility.Collapsed;
                this.tb2.Visibility = Visibility.Collapsed;
            }
            else if ((sender as RadioButton).Content.ToString() == "网口")
            {
                this.cb1.Visibility = Visibility.Collapsed;
                this.cb2.Visibility = Visibility.Collapsed;
                this.cb3.Visibility = Visibility.Collapsed;
                this.cb4.Visibility = Visibility.Collapsed;
                this.cb5.Visibility = Visibility.Collapsed;
                this.tb1.Visibility = Visibility.Visible;
                this.tb2.Visibility = Visibility.Visible;
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }

样式类

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2"
                    xmlns:local="Zhaoxi.MvvmLesson.View.Styles">

    <SolidColorBrush x:Key="TextBox.Static.Background" Color="#FFFFFFFF"/>
    <SolidColorBrush x:Key="ComboBox.Static.Border" Color="#FFACACAC"/>
    <SolidColorBrush x:Key="ComboBox.Static.Glyph" Color="#FF606060"/>
    <SolidColorBrush x:Key="ComboBox.Static.Editable.Button.Background" Color="Transparent"/>
    <SolidColorBrush x:Key="ComboBox.Static.Editable.Button.Border" Color="Transparent"/>
    <LinearGradientBrush x:Key="ComboBox.MouseOver.Editable.Button.Background" EndPoint="0,1" StartPoint="0,0">
        <GradientStop Color="#FFEBF4FC" Offset="0.0"/>
        <GradientStop Color="#FFDCECFC" Offset="1.0"/>
    </LinearGradientBrush>
    <SolidColorBrush x:Key="ComboBox.MouseOver.Editable.Button.Border" Color="#FF7EB4EA"/>
    <LinearGradientBrush x:Key="ComboBox.Pressed.Editable.Button.Background" EndPoint="0,1" StartPoint="0,0">
        <GradientStop Color="#FFDAEBFC" Offset="0.0"/>
        <GradientStop Color="#FFC4E0FC" Offset="1.0"/>
    </LinearGradientBrush>
    <SolidColorBrush x:Key="ComboBox.Pressed.Editable.Button.Border" Color="#FF569DE5"/>
    <SolidColorBrush x:Key="ComboBox.Disabled.Editable.Button.Background" Color="Transparent"/>
    <SolidColorBrush x:Key="ComboBox.Disabled.Editable.Button.Border" Color="Transparent"/>

    
    <Style x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}">
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="IsTabStop" Value="false"/>
        <Setter Property="Focusable" Value="false"/>
        <Setter Property="ClickMode" Value="Press"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ToggleButton}">
                    <Border x:Name="templateRoot" SnapsToDevicePixels="true" 
                                Background="{TemplateBinding Background}" 
                                BorderThickness="{TemplateBinding BorderThickness}" 
                                BorderBrush="{StaticResource ComboBox.Static.Border}"
                                CornerRadius="2">
                        <Border x:Name="splitBorder" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" 
                                    SnapsToDevicePixels="true" Margin="0" HorizontalAlignment="Right" 
                                    BorderThickness="1" BorderBrush="Transparent">
                            <TextBlock Text="&#xe6df;" FontFamily="{DynamicResource iconfont}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                        </Border>
                    </Border>
                    <ControlTemplate.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding IsEditable, RelativeSource={RelativeSource AncestorType={x:Type ComboBox}}}" Value="true"/>
                                <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="false"/>
                                <Condition Binding="{Binding IsPressed, RelativeSource={RelativeSource Self}}" Value="false"/>
                                <Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="true"/>
                            </MultiDataTrigger.Conditions>
                            <Setter Property="Background" TargetName="splitBorder" Value="{StaticResource ComboBox.Static.Editable.Button.Background}"/>
                            <Setter Property="BorderBrush" TargetName="splitBorder" Value="{StaticResource ComboBox.Static.Editable.Button.Border}"/>
                        </MultiDataTrigger>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="true"/>
                                <Condition Binding="{Binding IsEditable, RelativeSource={RelativeSource AncestorType={x:Type ComboBox}}}" Value="true"/>
                            </MultiDataTrigger.Conditions>
                            <Setter Property="Background" TargetName="splitBorder" Value="{StaticResource ComboBox.MouseOver.Editable.Button.Background}"/>
                            <Setter Property="BorderBrush" TargetName="splitBorder" Value="{StaticResource ComboBox.MouseOver.Editable.Button.Border}"/>
                        </MultiDataTrigger>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding IsPressed, RelativeSource={RelativeSource Self}}" Value="true"/>
                                <Condition Binding="{Binding IsEditable, RelativeSource={RelativeSource AncestorType={x:Type ComboBox}}}" Value="true"/>
                            </MultiDataTrigger.Conditions>
                            <Setter Property="Background" TargetName="splitBorder" Value="{StaticResource ComboBox.Pressed.Editable.Button.Background}"/>
                            <Setter Property="BorderBrush" TargetName="splitBorder" Value="{StaticResource ComboBox.Pressed.Editable.Button.Border}"/>
                        </MultiDataTrigger>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="false"/>
                                <Condition Binding="{Binding IsEditable, RelativeSource={RelativeSource AncestorType={x:Type ComboBox}}}" Value="true"/>
                            </MultiDataTrigger.Conditions>
                            <Setter Property="Background" TargetName="splitBorder" Value="{StaticResource ComboBox.Disabled.Editable.Button.Background}"/>
                            <Setter Property="BorderBrush" TargetName="splitBorder" Value="{StaticResource ComboBox.Disabled.Editable.Button.Border}"/>
                        </MultiDataTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="ComboBoxEditableTextBox" TargetType="{x:Type TextBox}">
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="AllowDrop" Value="true"/>
        <Setter Property="MinWidth" Value="0"/>
        <Setter Property="MinHeight" Value="0"/>
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
        <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <ScrollViewer x:Name="PART_ContentHost" Background="Transparent" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <ControlTemplate x:Key="ComboBoxTemplate" TargetType="{x:Type ComboBox}">
        <Grid x:Name="templateRoot" SnapsToDevicePixels="true">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Width="0"/>
            </Grid.ColumnDefinitions>
            <Popup x:Name="PART_Popup" AllowsTransparency="true" Grid.ColumnSpan="2"
                       IsOpen="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" 
                       Margin="1" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Placement="Bottom">
                <Themes:SystemDropShadowChrome x:Name="shadow" Color="Transparent"
                                                   MaxHeight="{TemplateBinding MaxDropDownHeight}" 
                                                   MinWidth="{Binding ActualWidth, ElementName=templateRoot}">
                    <Border x:Name="dropDownBorder" 
                                BorderBrush="{DynamicResource ComboBox.Static.Border}" 
                                BorderThickness="1" 
                                Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
                        <ScrollViewer x:Name="DropDownScrollViewer">
                            <Grid x:Name="grid" RenderOptions.ClearTypeHint="Enabled">
                                <Canvas x:Name="canvas" HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
                                    <Rectangle x:Name="opaqueRect" Fill="{Binding Background, ElementName=dropDownBorder}" Height="{Binding ActualHeight, ElementName=dropDownBorder}" Width="{Binding ActualWidth, ElementName=dropDownBorder}"/>
                                </Canvas>
                                <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Grid>
                        </ScrollViewer>
                    </Border>
                </Themes:SystemDropShadowChrome>
            </Popup>
            <ToggleButton x:Name="toggleButton" BorderBrush="{TemplateBinding BorderBrush}" 
                              BorderThickness="{TemplateBinding BorderThickness}" 
                              Background="White" Grid.ColumnSpan="2" 
                              IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
                              Style="{StaticResource ComboBoxToggleButton}"/>
            <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" 
                                  ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" 
                                  Content="{TemplateBinding SelectionBoxItem}"
                                  ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}"
                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                  IsHitTestVisible="false" Margin="{TemplateBinding Padding}" 
                                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true">
                <Setter Property="Margin" TargetName="shadow" Value="0,0,5,5"/>
                <Setter Property="Color" TargetName="shadow" Value="#71000000"/>
            </Trigger>
            <Trigger Property="HasItems" Value="false">
                <Setter Property="Height" TargetName="dropDownBorder" Value="95"/>
            </Trigger>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsGrouping" Value="true"/>
                    <Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="false"/>
                </MultiTrigger.Conditions>
                <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
            </MultiTrigger>
            <Trigger Property="ScrollViewer.CanContentScroll" SourceName="DropDownScrollViewer" Value="false">
                <Setter Property="Canvas.Top" TargetName="opaqueRect" Value="{Binding VerticalOffset, ElementName=DropDownScrollViewer}"/>
                <Setter Property="Canvas.Left" TargetName="opaqueRect" Value="{Binding HorizontalOffset, ElementName=DropDownScrollViewer}"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

    <ControlTemplate x:Key="ComboBoxEditableTemplate" TargetType="{x:Type ComboBox}">
        <Grid x:Name="templateRoot" SnapsToDevicePixels="true">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Width="0"/>
            </Grid.ColumnDefinitions>
            <Popup x:Name="PART_Popup" AllowsTransparency="true" Grid.ColumnSpan="2" 
                       IsOpen="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}" 
                       PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" 
                       Placement="Bottom">
                <Border x:Name="shadow" Background="Transparent" BorderBrush="#999" BorderThickness="1"
                                                   MaxHeight="{TemplateBinding MaxDropDownHeight}"
                                                   MinWidth="{Binding ActualWidth, ElementName=templateRoot}">
                    <Border x:Name="dropDownBorder" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" 
                                BorderThickness="0" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
                        <ScrollViewer x:Name="DropDownScrollViewer">
                            <Grid x:Name="grid" RenderOptions.ClearTypeHint="Enabled">
                                <Canvas x:Name="canvas" HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
                                    <Rectangle x:Name="opaqueRect" 
                                                   Fill="{Binding Background, ElementName=dropDownBorder}" 
                                                   Height="{Binding ActualHeight, ElementName=dropDownBorder}" 
                                                   Width="{Binding ActualWidth, ElementName=dropDownBorder}"/>
                                </Canvas>
                                <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                            </Grid>
                        </ScrollViewer>
                    </Border>
                </Border>
            </Popup>
            <ToggleButton x:Name="toggleButton" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.ColumnSpan="2" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ComboBoxToggleButton}"/>
            <Border x:Name="border" Background="{StaticResource TextBox.Static.Background}" Margin="{TemplateBinding BorderThickness}">
                <TextBox x:Name="PART_EditableTextBox" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" IsReadOnly="{Binding IsReadOnly, RelativeSource={RelativeSource TemplatedParent}}" Margin="{TemplateBinding Padding}" Style="{StaticResource ComboBoxEditableTextBox}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
            </Border>
        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="IsEnabled" Value="false">
                <Setter Property="Opacity" TargetName="border" Value="0.56"/>
            </Trigger>
            <Trigger Property="IsKeyboardFocusWithin" Value="true">
                <Setter Property="Foreground" Value="Black"/>
            </Trigger>
            <Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true">
                <Setter Property="Margin" TargetName="shadow" Value="0,0,5,5"/>
                <Setter Property="Background" TargetName="shadow" Value="#71000000"/>
            </Trigger>
            <Trigger Property="HasItems" Value="false">
                <Setter Property="Height" TargetName="dropDownBorder" Value="95"/>
            </Trigger>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsGrouping" Value="true"/>
                    <Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="false"/>
                </MultiTrigger.Conditions>
                <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
            </MultiTrigger>
            <Trigger Property="ScrollViewer.CanContentScroll" SourceName="DropDownScrollViewer" Value="false">
                <Setter Property="Canvas.Top" TargetName="opaqueRect" Value="{Binding VerticalOffset, ElementName=DropDownScrollViewer}"/>
                <Setter Property="Canvas.Left" TargetName="opaqueRect" Value="{Binding HorizontalOffset, ElementName=DropDownScrollViewer}"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

    <Style TargetType="{x:Type ComboBox}">
        <Setter Property="Background" Value="White"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="Padding" Value="6,3,5,3"/>
        <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
        <Setter Property="ScrollViewer.PanningMode" Value="Both"/>
        <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Template" Value="{StaticResource ComboBoxTemplate}"/>
        <Setter Property="Effect">
            <Setter.Value>
                <DropShadowEffect BlurRadius="5" ShadowDepth="0" Direction="0" Color="Gray" Opacity="0.2"/>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsEditable" Value="true">
                <Setter Property="IsTabStop" Value="false"/>
                <Setter Property="Padding" Value="2"/>
                <Setter Property="Template" Value="{StaticResource ComboBoxEditableTemplate}"/>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Effect">
                    <Setter.Value>
                        <DropShadowEffect BlurRadius="10" ShadowDepth="0" Direction="0" Color="Gray" Opacity="0.3"/>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

    <Style TargetType="ComboBoxItem">
        <Setter Property="Height" Value="28"/>
    </Style>
</ResourceDictionary>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <SolidColorBrush x:Key="TabItem.Selected.Background" Color="#FFFFFF"/>
    <SolidColorBrush x:Key="TabItem.Selected.Border" Color="#ACACAC"/>
    <Style TargetType="TabControl">
        <Setter Property="Padding" Value="2"/>
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Background" Value="{StaticResource TabItem.Selected.Background}"/>
        <Setter Property="BorderBrush" Value="{StaticResource TabItem.Selected.Border}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="TabStripPlacement" Value="Left"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TabControl}">
                    <Grid x:Name="templateRoot" ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="120"/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <Border BorderBrush="#DDD" BorderThickness="0,0,1,0"/>
                        <TabPanel x:Name="headerPanel" Background="Transparent" Grid.Column="0" IsItemsHost="true" Grid.Row="0" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1"/>
                        <Border x:Name="contentPanel" Background="Transparent" KeyboardNavigation.DirectionalNavigation="Contained"
                                Grid.Column="1" KeyboardNavigation.TabNavigation="Local" KeyboardNavigation.TabIndex="2">
                            <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style TargetType="TabItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TabItem">
                    <Border BorderBrush="Transparent" BorderThickness="0,0,1,0" Name="back" Background="Transparent"
                            Height="40">
                        <TextBlock Text="{TemplateBinding Header}" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="BorderBrush" Value="Orange" TargetName="back"/>
                            <Setter Property="Background" Value="white" TargetName="back"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

2021-09-04 WPF上位机通用框架平台实战-设备编辑_python
2021-09-04 WPF上位机通用框架平台实战-设备编辑_microsoft_02