wpf3d游戏引擎前端ControlTemplate实现

1.ControlTemplates.xaml

<ResourceDictionary

x:Class="PrimalEditor.Dictionaries.ControlTemplates"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:local="clr-namespace:PrimalEditor.Dictionaries"

xmlns:utl="clr-namespace:PrimalEditor.Utilities.Controls"

xmlns:wpf="http://schemas.microsoft.com/netfx/2009/xaml/presentation">

<!-- LightTextBlockStyle: Style for TextBlock -->

<Style TargetType="{x:Type TextBlock}" x:Key="LightTextBlockStyle">

<Setter Property="Foreground" Value="{StaticResource Editor.FontBrush}"/>

<Setter Property="VerticalAlignment" Value="Center"/>

<Setter Property="HorizontalAlignment" Value="Left"/>

</Style>

<!-- LightTextBoxStyle: Style for TextBox with specific background and borders -->

<Style TargetType="{x:Type TextBox}" x:Key="LightTextBoxStyle">

<Setter Property="Foreground" Value="{StaticResource Editor.FontBrush}"/>

<Setter Property="Background" Value="{StaticResource Editor.Window.GrayBrush2}"/>

<Setter Property="BorderBrush" Value="{StaticResource Editor.Window.GrayBrush4}"/>

<Setter Property="SelectionBrush" Value="White"/>

<Setter Property="VerticalAlignment" Value="Center"/>

<Setter Property="HorizontalAlignment" Value="Stretch"/>

<Setter Property="Padding" Value="0,2"/>

</Style>

<!-- TextBoxStyle_WithRename: Extended style with KeyDown and LostFocus handlers -->

<Style TargetType="{x:Type TextBox}" x:Key="TextBoxStyle_WithRename" BasedOn="{StaticResource LightTextBoxStyle}">

<EventSetter Event="KeyDown" Handler="OnTextBoxRename_KeyDown"/>

<EventSetter Event="LostFocus" Handler="OnTextBoxRename_LostFocus"/>

</Style>

<!-- FocusVisual: Focus visual for controls like buttons -->

<Style x:Key="FocusVisual">

<Setter Property="Control.Template">

<Setter.Value>

<ControlTemplate>

<Rectangle Margin="2" StrokeDashArray="1 2" SnapsToDevicePixels="true" StrokeThickness="1" Stroke="{StaticResource Editor.FontBrush}"/>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

<!-- ButtonStyle: Style for Button with gradient background and border -->

<Style TargetType="{x:Type Button}">

<Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>

<Setter Property="Background">

<Setter.Value>

<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">

<GradientStop Color="{StaticResource Editor.Window.GrayColor5}" Offset="0"/>

<GradientStop Color="{StaticResource Editor.Window.GrayColor4}" Offset="1"/>

</LinearGradientBrush>

</Setter.Value>

</Setter>

<Setter Property="BorderBrush">

<Setter.Value>

<LinearGradientBrush>

<GradientStop Color="{StaticResource Editor.Window.GrayColor5}" Offset="0"/>

<GradientStop Color="{StaticResource Editor.Window.GrayColor2}" Offset="1"/>

</LinearGradientBrush>

</Setter.Value>

</Setter>

<Setter Property="Foreground" Value="{StaticResource Editor.FontBrush}"/>

<Setter Property="BorderThickness" Value="0,1"/>

<Setter Property="HorizontalContentAlignment" Value="Center"/>

<Setter Property="VerticalContentAlignment" Value="Center"/>

<Setter Property="Padding" Value="5,3"/>

<Setter Property="Template">

<Setter.Value>

<ControlTemplate TargetType="{x:Type Button}">

<Grid>

<Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true" CornerRadius="3"/>

<Border x:Name="borderSelected" SnapsToDevicePixels="true" CornerRadius="3" BorderThickness="0" BorderBrush="Transparent"/>

<ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>

</Grid>

<ControlTemplate.Triggers>

<Trigger Property="IsDefaulted" Value="true">

<Setter Property="Background" TargetName="borderSelected" Value="{StaticResource Editor.Selected.BackgroundBrush}"/>

<Setter Property="OpacityMask" TargetName="borderSelected" Value="{StaticResource Button.Selected.OpacityBrush}"/>

</Trigger>

<Trigger Property="IsMouseOver" Value="true">

<Setter Property="TextBlock.Foreground" TargetName="contentPresenter" Value="White" />

<Setter Property="Background" TargetName="borderSelected" Value="{StaticResource Editor.Selected.BackgroundBrush}"/>

<Setter Property="OpacityMask" TargetName="borderSelected" Value="{StaticResource Button.Selected.OpacityBrush}"/>

</Trigger>

<Trigger Property="IsPressed" Value="true">

<Setter Property="TextBlock.Foreground" TargetName="contentPresenter" Value="White" />

<Setter Property="Background" TargetName="borderSelected" Value="{StaticResource Editor.Selected.BackgroundBrush}"/>

<Setter Property="OpacityMask" TargetName="borderSelected" Value="{StaticResource Button.Pressed.OpacityBrush}"/>

</Trigger>

<Trigger Property="IsEnabled" Value="false">

<Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Editor.Disabled.FontBrush}" />

<Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.BackgroundBrush}"/>

<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.BorderBrush}"/>

</Trigger>

</ControlTemplate.Triggers>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

<!-- ListBoxItemStyle: Style for ListBoxItem with selection and mouseover effects -->

<Style TargetType="{x:Type ListBoxItem}" x:Key="ListBoxItemStyle">

<Setter Property="SnapsToDevicePixels" Value="True" />

<Setter Property="Padding" Value="4,2,0,2" />

<Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>

<Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>

<Setter Property="Background" Value="Transparent" />

<Setter Property="BorderBrush" Value="Transparent" />

<Setter Property="BorderThickness" Value="0" />

<Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}" />

<Setter Property="Template">

<Setter.Value>

<ControlTemplate TargetType="{x:Type ListBoxItem}">

<Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">

<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>

</Border>

<ControlTemplate.Triggers>

<MultiTrigger>

<MultiTrigger.Conditions>

<Condition Property="Selector.IsSelectionActive" Value="False" />

<Condition Property="IsSelected" Value="True" />

</MultiTrigger.Conditions>

<Setter TargetName="Bd" Property="Background" Value="{StaticResource Editor.Window.GrayBrush4}" />

</MultiTrigger>

<MultiTrigger>

<MultiTrigger.Conditions>

<Condition Property="Selector.IsSelectionActive" Value="True" />

<Condition Property="IsSelected" Value="True" />

</MultiTrigger.Conditions>

<Setter TargetName="Bd" Property="Background" Value="{StaticResource Editor.Selected.BackgroundBrush}" />

</MultiTrigger>

<MultiTrigger>

<MultiTrigger.Conditions>

<Condition Property="IsMouseOver" Value="True" />

<Condition Property="Selector.IsSelectionActive" Value="True" />

<Condition Property="IsSelected" Value="False"/>

</MultiTrigger.Conditions>

<Setter TargetName="Bd" Property="Background">

<Setter.Value>

<SolidColorBrush Color="{StaticResource Editor.Selected.BackgroundColor}" Opacity="0.5"/>

</Setter.Value>

</Setter>

</MultiTrigger>

<MultiTrigger>

<MultiTrigger.Conditions>

<Condition Property="IsMouseOver" Value="True" />

<Condition Property="Selector.IsSelectionActive" Value="False" />

<Condition Property="IsSelected" Value="False"/>

</MultiTrigger.Conditions>

<Setter TargetName="Bd" Property="Background" Value="{StaticResource Editor.Window.GrayBrush4}" />

</MultiTrigger>

<Trigger Property="IsEnabled" Value="False">

<Setter TargetName="Bd" Property="TextElement.Foreground" Value="{StaticResource Editor.Disabled.FontBrush}"/>

</Trigger>

</ControlTemplate.Triggers>

</ControlTemplate>

</Setter.Value>

</Setter>

</Style>

</ResourceDictionary>

相关推荐
晓说前端2 小时前
TypeScript 核心语法应用 —— Vue 3 中的使用(上)
前端·typescript
No Silver Bullet2 小时前
Vue进阶(贰幺叁)vue.config.js 中 productionSourceMap 作用详解
前端·javascript·vue.js
xcsweb2 小时前
从5分钟到10秒:我用一个Skill把团队部署效率提升了30倍
前端·vue.js
神码编程2 小时前
【Unity】 HTFramework框架(七十)MultiChoiceDropdown可多选的下拉菜单
unity·游戏引擎·ugui·dropdown·下拉菜单
用户62960593247052 小时前
一次位置调整引发的画布失忆:深入 Vue2 虚拟 DOM 复用机制
前端·vue.js
Sterting2 小时前
条件渲染与列表渲染
前端·vue.js
__sjfzllv___2 小时前
在职前端Leader学习/转行 AI Agent -DAY28
前端
不爱说话郭德纲2 小时前
uni-app x iOS 扫码模糊怎么办?AVFoundation 灰尘级别摄像头助你超广角聚焦
前端·uni-app·app
柒和远方2 小时前
V062:WebGPU 端侧推理与单例模式:从 Transformers.js 把大模型装进浏览器,到 Worker 线程的流式对话
前端
huabuyu2 小时前
INP 自动化归因与自愈:如何自动定位、修复并验证一次卡顿
前端·javascript