重新设计 WPF 扩展工具包的 ChildWindow
Restyling the WPF Extended Toolkit's ChildWindow
我有一个使用 WPF 扩展工具包 ChildWindow
显示的模态对话框,但我不喜欢 window 的默认外观,因为它不正确支持系统颜色(它有一个强制的白色背景)并且在使用时不适应 Windows Classic Shell。
因此,我试图为 ChildWindow
创建我自己的样式,但在这样做时我破坏了控件的对话框行为 - 我将如何设置它的样式以恢复此行为?
我的对话框样式如下。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfToolkit="http://schemas.xceed.com/wpf/xaml/toolkit">
<Style TargetType="wpfToolkit:ChildWindow">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="wpfToolkit:ChildWindow">
<!--<Window WindowState="{TemplateBinding WindowState}" Visibility="{TemplateBinding Visibility}" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}">-->
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border Grid.RowSpan="2"
BorderThickness="2"
BorderBrush="Gold"/>
<Rectangle>
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Lime"/>
<GradientStop Color="DarkGreen"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<TextBlock Foreground="White" Text="{TemplateBinding Caption}"/>
<ContentPresenter Grid.Row="1"/>
</Grid>
<!--</Window>-->
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
我曾尝试将其嵌套在 window 中以恢复对话行为,但我得到了 "Window must be the root of the tree. Cannot add Window as a child of Visual." 的运行时异常。我的风格需要什么?
从默认样式开始,然后根据您的需要进行自定义:
XAML:
<Window x:Class="WpfApp27.MainWindow"
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:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:local="clr-namespace:WpfApp27"
mc:Ignorable="d"
Title="MainWindow" Height="300" Width="300">
<Window.Resources>
<LinearGradientBrush x:Key="LinearGradientBrushStyle1" StartPoint="0,0" EndPoint="1,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Lime"/>
<GradientStop Color="DarkGreen" Offset="0.5"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
<Style x:Key="ChildWindowStyle1" TargetType="{x:Type xctk:ChildWindow}">
<Setter Property="Background" Value="Navy"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="WindowBackground" Value="{StaticResource LinearGradientBrushStyle1}"/>
<Setter Property="MinWidth" Value="120"/>
<Setter Property="MinHeight" Value="45"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type xctk:ChildWindow}">
<Grid x:Name="PART_Root">
<Grid.Resources>
<Style x:Key="FocusVisualStyle" TargetType="{x:Type Control}">
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Margin" Value="-1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Fill="{TemplateBinding Background}" Margin="{TemplateBinding Margin}" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="0.5" StrokeDashArray="4 3">
<Rectangle.RenderTransform>
<TranslateTransform X="{Binding Left}" Y="{Binding Top}"/>
</Rectangle.RenderTransform>
</Rectangle>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Grid.Resources>
<Grid x:Name="PART_WindowRoot" HorizontalAlignment="Left" Height="{TemplateBinding Height}" MinWidth="{TemplateBinding MinWidth}" MinHeight="{TemplateBinding MinHeight}" VerticalAlignment="Top" Width="{TemplateBinding Width}">
<xctk:WindowControl x:Name="PART_WindowControl" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CloseButtonVisibility="{TemplateBinding CloseButtonVisibility}" CaptionForeground="{TemplateBinding CaptionForeground}" ContentTemplate="{TemplateBinding ContentTemplate}" CaptionFontSize="{TemplateBinding CaptionFontSize}" Caption="{TemplateBinding Caption}" Content="{TemplateBinding Content}" CaptionShadowBrush="{TemplateBinding CaptionShadowBrush}" CloseButtonStyle="{TemplateBinding CloseButtonStyle}" CaptionIcon="{TemplateBinding CaptionIcon}" Height="{TemplateBinding Height}" IsActive="{TemplateBinding IsActive}" WindowStyle="{TemplateBinding WindowStyle}" WindowBackground="{TemplateBinding WindowBackground}" WindowOpacity="{TemplateBinding WindowOpacity}" WindowInactiveBackground="{TemplateBinding WindowInactiveBackground}" WindowBorderBrush="{TemplateBinding WindowBorderBrush}" Width="{TemplateBinding Width}" WindowBorderThickness="{TemplateBinding WindowBorderThickness}"/>
</Grid>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="WindowState" Value="Closed">
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.BasedOn>
<Style TargetType="{x:Type xctk:WindowControl}">
<Setter Property="CloseButtonStyle">
<Setter.Value>
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Blue"/>
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border" BorderThickness="0" Background="{TemplateBinding Background}" Padding="1">
<ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsActive, RelativeSource={RelativeSource TemplatedParent}}" Value="False">
<Setter Property="Background" Value="#FFBCBCBC"/>
</DataTrigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="SkyBlue"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="#FF993D3D"/>
</Trigger>
</Style.Triggers>
</Style>
</Setter.Value>
</Setter>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Background" Value="White"/>
<Setter Property="CaptionFontSize" Value="15"/>
<Setter Property="CaptionForeground" Value="white"/>
<Setter Property="CaptionShadowBrush" Value="Transparent"/>
<Setter Property="WindowBorderBrush" Value="Gold"/>
<Setter Property="WindowBackground" Value="#FF0078D7"/>
<Setter Property="WindowBorderThickness" Value="5"/>
<Setter Property="WindowInactiveBackground" Value="#FFEBEBEB"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate/>
</Setter.Value>
</Setter>
</Style>
</Style.BasedOn>
</Style>
</Window.Resources>
<Grid>
<xctk:WindowContainer Grid.Row="0">
<xctk:ChildWindow Grid.Row="0" Width="200" Height="150" Caption="Child Window" IsModal="True" WindowState="Open" Style="{DynamicResource ChildWindowStyle1}">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock>My Child Window</TextBlock>
<Button Width="75" Height="25">CHILD</Button>
</StackPanel>
</xctk:ChildWindow>
</xctk:WindowContainer>
</Grid>
我有一个使用 WPF 扩展工具包 ChildWindow
显示的模态对话框,但我不喜欢 window 的默认外观,因为它不正确支持系统颜色(它有一个强制的白色背景)并且在使用时不适应 Windows Classic Shell。
ChildWindow
创建我自己的样式,但在这样做时我破坏了控件的对话框行为 - 我将如何设置它的样式以恢复此行为?
我的对话框样式如下。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfToolkit="http://schemas.xceed.com/wpf/xaml/toolkit">
<Style TargetType="wpfToolkit:ChildWindow">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="wpfToolkit:ChildWindow">
<!--<Window WindowState="{TemplateBinding WindowState}" Visibility="{TemplateBinding Visibility}" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}">-->
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border Grid.RowSpan="2"
BorderThickness="2"
BorderBrush="Gold"/>
<Rectangle>
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Lime"/>
<GradientStop Color="DarkGreen"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<TextBlock Foreground="White" Text="{TemplateBinding Caption}"/>
<ContentPresenter Grid.Row="1"/>
</Grid>
<!--</Window>-->
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
我曾尝试将其嵌套在 window 中以恢复对话行为,但我得到了 "Window must be the root of the tree. Cannot add Window as a child of Visual." 的运行时异常。我的风格需要什么?
从默认样式开始,然后根据您的需要进行自定义:
XAML:
<Window x:Class="WpfApp27.MainWindow"
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:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:local="clr-namespace:WpfApp27"
mc:Ignorable="d"
Title="MainWindow" Height="300" Width="300">
<Window.Resources>
<LinearGradientBrush x:Key="LinearGradientBrushStyle1" StartPoint="0,0" EndPoint="1,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="Lime"/>
<GradientStop Color="DarkGreen" Offset="0.5"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
<Style x:Key="ChildWindowStyle1" TargetType="{x:Type xctk:ChildWindow}">
<Setter Property="Background" Value="Navy"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="WindowBackground" Value="{StaticResource LinearGradientBrushStyle1}"/>
<Setter Property="MinWidth" Value="120"/>
<Setter Property="MinHeight" Value="45"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type xctk:ChildWindow}">
<Grid x:Name="PART_Root">
<Grid.Resources>
<Style x:Key="FocusVisualStyle" TargetType="{x:Type Control}">
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Margin" Value="-1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Fill="{TemplateBinding Background}" Margin="{TemplateBinding Margin}" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="0.5" StrokeDashArray="4 3">
<Rectangle.RenderTransform>
<TranslateTransform X="{Binding Left}" Y="{Binding Top}"/>
</Rectangle.RenderTransform>
</Rectangle>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</Grid.Resources>
<Grid x:Name="PART_WindowRoot" HorizontalAlignment="Left" Height="{TemplateBinding Height}" MinWidth="{TemplateBinding MinWidth}" MinHeight="{TemplateBinding MinHeight}" VerticalAlignment="Top" Width="{TemplateBinding Width}">
<xctk:WindowControl x:Name="PART_WindowControl" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CloseButtonVisibility="{TemplateBinding CloseButtonVisibility}" CaptionForeground="{TemplateBinding CaptionForeground}" ContentTemplate="{TemplateBinding ContentTemplate}" CaptionFontSize="{TemplateBinding CaptionFontSize}" Caption="{TemplateBinding Caption}" Content="{TemplateBinding Content}" CaptionShadowBrush="{TemplateBinding CaptionShadowBrush}" CloseButtonStyle="{TemplateBinding CloseButtonStyle}" CaptionIcon="{TemplateBinding CaptionIcon}" Height="{TemplateBinding Height}" IsActive="{TemplateBinding IsActive}" WindowStyle="{TemplateBinding WindowStyle}" WindowBackground="{TemplateBinding WindowBackground}" WindowOpacity="{TemplateBinding WindowOpacity}" WindowInactiveBackground="{TemplateBinding WindowInactiveBackground}" WindowBorderBrush="{TemplateBinding WindowBorderBrush}" Width="{TemplateBinding Width}" WindowBorderThickness="{TemplateBinding WindowBorderThickness}"/>
</Grid>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="WindowState" Value="Closed">
<Setter Property="Visibility" Value="Collapsed"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.BasedOn>
<Style TargetType="{x:Type xctk:WindowControl}">
<Setter Property="CloseButtonStyle">
<Setter.Value>
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Blue"/>
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border" BorderThickness="0" Background="{TemplateBinding Background}" Padding="1">
<ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsActive, RelativeSource={RelativeSource TemplatedParent}}" Value="False">
<Setter Property="Background" Value="#FFBCBCBC"/>
</DataTrigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="SkyBlue"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="#FF993D3D"/>
</Trigger>
</Style.Triggers>
</Style>
</Setter.Value>
</Setter>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Background" Value="White"/>
<Setter Property="CaptionFontSize" Value="15"/>
<Setter Property="CaptionForeground" Value="white"/>
<Setter Property="CaptionShadowBrush" Value="Transparent"/>
<Setter Property="WindowBorderBrush" Value="Gold"/>
<Setter Property="WindowBackground" Value="#FF0078D7"/>
<Setter Property="WindowBorderThickness" Value="5"/>
<Setter Property="WindowInactiveBackground" Value="#FFEBEBEB"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate/>
</Setter.Value>
</Setter>
</Style>
</Style.BasedOn>
</Style>
</Window.Resources>
<Grid>
<xctk:WindowContainer Grid.Row="0">
<xctk:ChildWindow Grid.Row="0" Width="200" Height="150" Caption="Child Window" IsModal="True" WindowState="Open" Style="{DynamicResource ChildWindowStyle1}">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock>My Child Window</TextBlock>
<Button Width="75" Height="25">CHILD</Button>
</StackPanel>
</xctk:ChildWindow>
</xctk:WindowContainer>
</Grid>