ControlTemplate允许您指定控件的可视结构。控件作者可以定义默认的ControlTemplate,应用程序作者可以覆盖ControlTemplate以重建控件的可视结构。
ContentControl 的 WinUI TemplateSelector 不起作用
当我运行我的应用程序时,我没有使用数据模板,而是看到控件中显示的视图模型的完整类名。 MyDataTemplateSelector 类已实例化,但是
我想使用具有不同 CornerRadius 的 ComboBox,如何简单地更改它?我尝试过 Style 和 ControlTemplate,但没有成功。
使用其名称从基于它的样式访问样式 ControlTemplate 中的元素
我有一个按钮的样式,比如 ButtonStyle,里面有 VisualStates、属性和触发器。我有另一种基于 ButtonStyle 的样式。我需要访问一个名为“OnhoverGrid”的元素...
有没有办法使用滑块的 ControlTemplate 触发值更改事件
我正在尝试设计一个 ControlTemplate,使 Slider 看起来像 NumericUpDown 控件。 它有一个三列的网格,其中有一个递减按钮,一个显示的文本块...
DataGridRowHeader IsPressed 事件不更改背景
我有一个 DataGridRowHeader 的自定义样式,并且 Trigger IsPressed 似乎没有触发。 IsMouseOver 工作正常。我基本上具有与 DataGridColumnHe 触发器相同的样式...
如何使用ControlTemplate设置ListViewItem的样式?
我是 WPF 新手,绑定和样式的整个世界非常令人困惑。 我已经为 ListViewItem 创建了默认 ControlTemplate 的副本: 我是 WPF 新手,绑定和样式的整个世界非常令人困惑。 我已经为 ListViewItem 创建了默认 ControlTemplate 的副本: <Window.Resources> <ControlTemplate x:Key="ListViewItemControlTemplate1" TargetType="{x:Type ListViewItem}"> ... </ControlTemplate> </Window.Resources> 然后我的 ListView 中有列,例如: <ListView x:Name="lstFiles"> <ListView.View> <GridView> <GridViewColumn x:Name="clmName" Header="Name" DisplayMemberBinding="{Binding Name}" /> </GridView> </ListView.View> </ListView> 如果我在设计器中添加新项目,我可以轻松应用该 ControlTemplate: <ListViewItem Content="ListViewItem1" Template="{DynamicResource ListViewItemControlTemplate1}"/> 但是,当使用 lstFiles.ItemsSource 将项目绑定到 ListView 时,如何使用该模板? 我认为您想覆盖列表视图项的样式。来自:如何覆盖ListViewItem样式? <ListView.ItemContainerStyle> <Style TargetType="ListViewItem" BasedOn="{StaticResource MaterialDesignListBoxItem}"> <Style.Resources> <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.ListBox.xaml" /> </Style.Resources> <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown" /> </Style>
我想将 WPF 复选框中的勾号颜色从黑色更改为白色。我尝试在 CheckBox 声明中执行此操作,如下所示: 我想将 WPF CheckBox 中的勾号颜色从黑色更改为白色。我尝试在 CheckBox 声明中这样做: <CheckBox Background="black" Foreground="White" BorderBrush="#262626"/> 背景和边框成功更改,但刻度线本身未更改。 您可以从 MSDN 服务器复制整个复选框样式,但由于在任何 WPF 项目开始时使用它都非常令人困惑,因此我将(在我看来)必要的位编译成一种更容易理解的样式: <Style TargetType="{x:Type CheckBox}"> <Setter Property="Background" Value="White" /> <Setter Property="BorderBrush" Value="#FF262E34"/> <!-- your color here --> <Setter Property="Foreground" Value="HotPink"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type CheckBox}"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" > <Border BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" Width="15" Height="15"> <Grid> <Grid Background="{TemplateBinding Foreground}" Margin="1" Visibility="Collapsed" Name="nullBlock"/> <Path Stretch="Uniform" Width="15" Height="10" Fill="{TemplateBinding Foreground}" Name="eliCheck" Data="F1 M 9.97498,1.22334L 4.6983,9.09834L 4.52164,9.09834L 0,5.19331L 1.27664,3.52165L 4.255,6.08833L 8.33331,1.52588e-005L 9.97498,1.22334 Z " Visibility="Collapsed"/> </Grid> </Border> <TextBlock Margin="5,0,0,0" VerticalAlignment="Center" Foreground="White" Text="{TemplateBinding Content}"></TextBlock> </StackPanel> <ControlTemplate.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="LightGray" /> </Trigger> <Trigger Property="IsPressed" Value="True"> <Setter Property="Background" Value="#FF9C9E9F" /> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Background" Value="LightGray" /> <Setter Property="Foreground" Value="Gray" /> <Setter Property="BorderBrush" Value="Gray"/> <Setter TargetName="eliCheck" Property="Opacity" Value="0.5" /> </Trigger> <Trigger Property="IsChecked" Value="True"> <Setter TargetName="eliCheck" Property="Visibility" Value="Visible"></Setter> </Trigger> <Trigger Property="IsChecked" Value="{x:Null}"> <Setter TargetName="nullBlock" Property="Visibility" Value="Visible"></Setter> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> 只需将此样式复制到 Window.Resources 或您认为合适的任何其他位置即可,或者直接将其粘贴到复选框样式属性中。 CheckBox控件具有各种视觉状态,背景、边框和选项标记字形具有不同的颜色。您可以参考文档了解所需的部件和视觉状态。 如果要编辑颜色,则必须更改默认样式和控件模板。您可以使用 Blend 或 Visual Studio 提取它。以下是默认模板。您需要做的是将这些资源复制到范围内的资源字典中,例如应用程序资源并调整 SolidColorBurshes。<SolidColorBrush x:Key="OptionMark.Static.Background" Color="#FFFFFFFF"/> <SolidColorBrush x:Key="OptionMark.Static.Border" Color="#FF707070"/> <SolidColorBrush x:Key="OptionMark.Static.Glyph" Color="#FF212121"/> <SolidColorBrush x:Key="OptionMark.MouseOver.Background" Color="#FFF3F9FF"/> <SolidColorBrush x:Key="OptionMark.MouseOver.Border" Color="#FF5593FF"/> <SolidColorBrush x:Key="OptionMark.MouseOver.Glyph" Color="#FF212121"/> <SolidColorBrush x:Key="OptionMark.Pressed.Background" Color="#FFD9ECFF"/> <SolidColorBrush x:Key="OptionMark.Pressed.Border" Color="#FF3C77DD"/> <SolidColorBrush x:Key="OptionMark.Pressed.Glyph" Color="#FF212121"/> <SolidColorBrush x:Key="OptionMark.Disabled.Background" Color="#FFE6E6E6"/> <SolidColorBrush x:Key="OptionMark.Disabled.Border" Color="#FFBCBCBC"/> <SolidColorBrush x:Key="OptionMark.Disabled.Glyph" Color="#FF707070"/> <Style x:Key="FocusVisual"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate> <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeDashArray="1 2" StrokeThickness="1" /> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style x:Key="OptionMarkFocusVisual"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate> <Rectangle Margin="14,0,0,0" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeDashArray="1 2" StrokeThickness="1" /> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style x:Key="CheckBoxStyle" TargetType="{x:Type CheckBox}"> <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}" /> <Setter Property="Background" Value="{StaticResource OptionMark.Static.Background}" /> <Setter Property="BorderBrush" Value="{StaticResource OptionMark.Static.Border}" /> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" /> <Setter Property="BorderThickness" Value="1" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type CheckBox}"> <Grid x:Name="templateRoot" Background="Transparent" SnapsToDevicePixels="True"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Border x:Name="checkBoxBorder" Margin="1" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <Grid x:Name="markGrid"> <Path x:Name="optionMark" Margin="1" Data="F1 M 9.97498,1.22334L 4.6983,9.09834L 4.52164,9.09834L 0,5.19331L 1.27664,3.52165L 4.255,6.08833L 8.33331,1.52588e-005L 9.97498,1.22334 Z " Fill="{StaticResource OptionMark.Static.Glyph}" Opacity="0" Stretch="None" /> <Rectangle x:Name="indeterminateMark" Margin="2" Fill="{StaticResource OptionMark.Static.Glyph}" Opacity="0" /> </Grid> </Border> <ContentPresenter x:Name="contentPresenter" Grid.Column="1" Margin="{TemplateBinding Padding}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Focusable="False" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> </Grid> <ControlTemplate.Triggers> <Trigger Property="HasContent" Value="true"> <Setter Property="FocusVisualStyle" Value="{StaticResource OptionMarkFocusVisual}" /> <Setter Property="Padding" Value="4,-1,0,0" /> </Trigger> <Trigger Property="IsMouseOver" Value="true"> <Setter TargetName="checkBoxBorder" Property="Background" Value="{StaticResource OptionMark.MouseOver.Background}" /> <Setter TargetName="checkBoxBorder" Property="BorderBrush" Value="{StaticResource OptionMark.MouseOver.Border}" /> <Setter TargetName="optionMark" Property="Fill" Value="{StaticResource OptionMark.MouseOver.Glyph}" /> <Setter TargetName="indeterminateMark" Property="Fill" Value="{StaticResource OptionMark.MouseOver.Glyph}" /> </Trigger> <Trigger Property="IsEnabled" Value="false"> <Setter TargetName="checkBoxBorder" Property="Background" Value="{StaticResource OptionMark.Disabled.Background}" /> <Setter TargetName="checkBoxBorder" Property="BorderBrush" Value="{StaticResource OptionMark.Disabled.Border}" /> <Setter TargetName="optionMark" Property="Fill" Value="{StaticResource OptionMark.Disabled.Glyph}" /> <Setter TargetName="indeterminateMark" Property="Fill" Value="{StaticResource OptionMark.Disabled.Glyph}" /> </Trigger> <Trigger Property="IsPressed" Value="true"> <Setter TargetName="checkBoxBorder" Property="Background" Value="{StaticResource OptionMark.Pressed.Background}" /> <Setter TargetName="checkBoxBorder" Property="BorderBrush" Value="{StaticResource OptionMark.Pressed.Border}" /> <Setter TargetName="optionMark" Property="Fill" Value="{StaticResource OptionMark.Pressed.Glyph}" /> <Setter TargetName="indeterminateMark" Property="Fill" Value="{StaticResource OptionMark.Pressed.Glyph}" /> </Trigger> <Trigger Property="IsChecked" Value="true"> <Setter TargetName="optionMark" Property="Opacity" Value="1" /> <Setter TargetName="indeterminateMark" Property="Opacity" Value="0" /> </Trigger> <Trigger Property="IsChecked" Value="{x:Null}"> <Setter TargetName="optionMark" Property="Opacity" Value="0" /> <Setter TargetName="indeterminateMark" Property="Opacity" Value="1" /> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> 由于 Static、MouseOver、Pressed 和 Disabled 状态有不同的颜色,您可能必须从背景、边框和前景色中派生一个小的调色板。 为了使用适配的复选框样式,您可以通过 key 显式引用它: <CheckBox Style="{StaticResource CheckBoxStyle}" /> 您还可以在其他资源之后定义如下隐式样式,因此该样式将自动应用于包含资源字典范围内的所有CheckBox。<Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource CheckBoxStyle}"/> 在这种情况下,您不再显式引用样式。 <CheckBox />
我的项目中有一个Xaml代码,如下所示: 我的项目中有一个 Xaml 代码,如下所示: <Window.Resources> <!-- MoveThumb Template --> <ControlTemplate x:Key="MoveThumbTemplate" TargetType="{x:Type local:MoveThumb}"> <Rectangle Fill="Transparent"/> </ControlTemplate> <!-- ResizeDecorator Template --> <ControlTemplate x:Key="ResizeDecoratorTemplate" TargetType="{x:Type Control}"> <Grid> <local:ResizeThumb Height="3" Cursor="SizeNS" Margin="0 -4 0 0" VerticalAlignment="Top" HorizontalAlignment="Stretch"/> <local:ResizeThumb Width="3" Cursor="SizeWE" Margin="-4 0 0 0" VerticalAlignment="Stretch" HorizontalAlignment="Left"/> <local:ResizeThumb Width="3" Cursor="SizeWE" Margin="0 0 -4 0" VerticalAlignment="Stretch" HorizontalAlignment="Right"/> <local:ResizeThumb Height="3" Cursor="SizeNS" Margin="0 0 0 -4" VerticalAlignment="Bottom" HorizontalAlignment="Stretch"/> <local:ResizeThumb Width="7" Height="7" Cursor="SizeNWSE" Margin="-6 -6 0 0" VerticalAlignment="Top" HorizontalAlignment="Left"/> <local:ResizeThumb Width="7" Height="7" Cursor="SizeNESW" Margin="0 -6 -6 0" VerticalAlignment="Top" HorizontalAlignment="Right"/> <local:ResizeThumb Width="7" Height="7" Cursor="SizeNESW" Margin="-6 0 0 -6" VerticalAlignment="Bottom" HorizontalAlignment="Left"/> <local:ResizeThumb Width="7" Height="7" Cursor="SizeNWSE" Margin="0 0 -6 -6" VerticalAlignment="Bottom" HorizontalAlignment="Right"/> </Grid> </ControlTemplate> <!-- Designer Item Template--> <ControlTemplate x:Key="DesignerItemTemplate" TargetType="ContentControl"> <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}"> <local:MoveThumb Template="{StaticResource MoveThumbTemplate}" Cursor="SizeAll"/> <Control Template="{StaticResource ResizeDecoratorTemplate}"/> <ContentPresenter Content="{TemplateBinding ContentControl.Content}"/> </Grid> </ControlTemplate> </Window.Resources> .... <Canvas x:Name="Container" Background="Transparent">**strong text** <ContentControl Width="130" MinWidth="50" Height="130" MinHeight="50" Canvas.Top="150" Canvas.Left="150" Template="{StaticResource DesignerItemTemplate}"> <Rectangle Fill="AliceBlue" Opacity="0.5" Margin="10" Stroke="Blue" StrokeThickness="1" RadiusX="0" /> </ContentControl> </Canvas MoveThumb.CS using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Controls.Primitives; namespace Test_Canvas_Rectangle { class MoveThumb: Thumb { public MoveThumb() { DragDelta += new DragDeltaEventHandler(this.MoveThumb_DragDelta); } private void MoveThumb_DragDelta(object sender, DragDeltaEventArgs e) { Control designerItem = this.DataContext as Control; if (designerItem != null) { double left = Canvas.GetLeft(designerItem); double top = Canvas.GetTop(designerItem); Canvas.SetLeft(designerItem, left + e.HorizontalChange); Canvas.SetTop(designerItem, top + e.VerticalChange); } } } } 调整Thumb.CS using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; namespace Test_Canvas_Rectangle { class ResizeThumb : Thumb { public ResizeThumb() { DragDelta += new DragDeltaEventHandler(this.ResizeThumb_DragDelta); } private void ResizeThumb_DragDelta(object sender, DragDeltaEventArgs e) { Control designerItem = this.DataContext as Control; if (designerItem != null) { double deltaVertical, deltaHorizontal; switch (VerticalAlignment) { case VerticalAlignment.Bottom: deltaVertical = Math.Min(-e.VerticalChange, designerItem.ActualHeight - designerItem.MinHeight); designerItem.Height -= deltaVertical; break; case VerticalAlignment.Top: deltaVertical = Math.Min(e.VerticalChange, designerItem.ActualHeight - designerItem.MinHeight); Canvas.SetTop(designerItem, Canvas.GetTop(designerItem) + deltaVertical); designerItem.Height -= deltaVertical; break; default: break; } switch (HorizontalAlignment) { case HorizontalAlignment.Left: deltaHorizontal = Math.Min(e.HorizontalChange, designerItem.ActualWidth - designerItem.MinWidth); Canvas.SetLeft(designerItem, Canvas.GetLeft(designerItem) + deltaHorizontal); designerItem.Width -= deltaHorizontal; break; case HorizontalAlignment.Right: deltaHorizontal = Math.Min(-e.HorizontalChange, designerItem.ActualWidth - designerItem.MinWidth); designerItem.Width -= deltaHorizontal; break; default: break; } } e.Handled = true; } } } 实际上我想添加矩形使用C# Side使用鼠标移动如下: private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { var Limit = (FrameworkElement)sender; // Set left mouse button state to released _LeftMouseHeld = false; // Hide all the listbox (if you forget to specify width and height you will have remanent coordinates SelectBox.Visibility = Visibility.Collapsed; SelectBox.Width = 0; SelectBox.Height = 0; Random rnd = new Random(Guid.NewGuid().ToString().GetHashCode()); CC = new ContentControl() { Width = width, Height = height, Template = DesignerItemTemplate, }; rec = new Rectangle() { Fill = PickRandomBrush(rnd), Opacity = 0.5, }; //CC.Content = rec; //CC.Content = rec; Container.Children.Add(CC); if (currentPos.X > _InitPos.X) { Canvas.SetLeft(rec, _InitPos.X); rec.Width = currentPos.X - _InitPos.X; } else { Canvas.SetLeft(rec, currentPos.X); rec.Width = _InitPos.X - currentPos.X; } // Y coordinates if (currentPos.Y > _InitPos.Y) { Canvas.SetTop(rec, _InitPos.Y); rec.Height = currentPos.Y - _InitPos.Y; } else { Canvas.SetTop(rec, currentPos.Y); rec.Height = _InitPos.Y - currentPos.Y; } Limit.ReleaseMouseCapture(); } 问题是我无法在我的应用程序中显示矩形和 conrolTemplate。 我尝试使用 Container.Children.Add(rec); 显示矩形 它显示了结果,但我无法将矩形添加到我的控件项目中。 感谢您的帮助 我找到了一个非常有用的代码示例并按照我自己的风格对其进行了定制。此示例可以向画布添加不同的形状,并使用户能够在运行时更改大小以及选择和移动。 通过删除一些 Feachers 并更改颜色,以及删除一些附加功能,我们得到了所需的正确结果
根据此 MSDN 链接, 没有办法只更换部分 控件的可视树;到 更改控件的可视化树 您必须设置 Template 属性 控制到它的新和
我有一个 Devexpress DateEdit 并添加了一个触发器,当 IsEnabled=False 时将 ControlTemplate 更改为标签。这一切都很好,但我的问题是,标签的文本仍然是 Gr...
共享ControlTemplate.两个按钮样式之间的触发器
请提供一点帮助...我有这个 ResourceDictionary 来设置按钮的样式。有一个“基本按钮样式”,现在我正在开发一个按钮,该按钮将有一个下拉内容菜单,其中
我想实现一些带有循环图标和占位符的自定义搜索文本框。因此,我创建了一个自定义控制模板,其中有用于循环图标的 TextBlock(我使用了特定的一些符号...
如何在.Net MAUI中根据控件状态改变ContentPresenter的文本颜色
我的问题是这个问题的扩展,我想根据单选按钮的状态更改文本颜色。如果选中,我希望它是白色的,如果未选中,我希望它是黑色的。 细节: 我正在使用 c...
将 DataTemplateSelector 与 ContentTemplate 结合使用(无 xaml)
在页面上,我可以使用 ControlTemplate 来填充页面的内容。 在此示例中,基于任意变量 bleDevice、为空或不为空,内容有 2 个选择... 内部空虚
将 DataTemplateSelector 与 ContentTemlate 结合使用(无 xaml)
在页面上,我可以使用 ControlTemplate 来填充页面的内容。 在此示例中,基于任意变量 bleDevice、为空或不为空,内容有 2 个选择... 内部空虚
我希望能够通过在 ViewModel 中设置属性来禁用用户的组合框。 最后,在某些情况下,用户应该只能查看 SelectedItem。 有一些
我希望 POPUP 内的 ComboBox 项目采用 ToggleButton 的高度和宽度,对于宽度来说很好,因为我可以将它绑定在 POPUP 上,但高度适用于每个 ComboBox 项目,这是一个单独的...
WPF 如何允许我的 ControlTemplate 使用现有的 NavigationService?
我有一个菜单 ControlTemplate,我想将其用于我的所有页面。 ControlTemplate 的函数调用需要使用属于我的 NavigationWindow 的 NavigationService。嗬...
如何创建一个没有边框且只能通过手柄调整大小的 WPF 窗口?
如果在WPF窗口上设置ResizeMode =“CanResizeWithGrip”,则右下角会显示调整大小夹点,如下所示: 如果您设置 WindowStyle="None" 以及标题栏消失,但灰色
如何使用绑定和 DataTemplate -或 - MAUI 的 ContentControl 来呈现数据
如何使用绑定和 DataTemplate 呈现字符串、数字或视图模型? 我正在寻找 WPF ContentControl 的 MAUI 替代品。 ContentView 有一个 Content 属性,但这...