gpt4 book ai didi

wpf - 在 WPF ListBox 中,如何将项目的聚焦选择样式 "copy"转换为非聚焦选择样式?

转载 作者:行者123 更新时间:2023-12-01 13:46:16 27 4
gpt4 key购买 nike

首先,这是不是 Setting the Inactive Highlight Colour of a WPF ListBox to the Active Highlight Colour 的副本.对此的解释如下。

设置:

我在 UserControl 中有一个 WPF ListBox,稍后将其放入使用重主题的应用程序中。从 UserControl 的角度来看,我不知道主题会是什么样子。

期望的行为:

如果 ListBox 在某些时候没有焦点,我仍然希望所选 ListBoxItems 具有与 ListBox 有焦点相同的外观。

附加信息:

请注意,仅将颜色设置为某些系统默认值是行不通的。这样做会覆盖包含应用程序的主题。 (这就是为什么这个问题不是上面链接问题的重复的原因。)

有没有办法实现这一点,例如使用 XAML?

编辑 : 经过一番研究,我想我想创建一个“默认”的副本 ListBoxItem样式(“默认”至少在 UserControl 级别的默认设置方面),其中所有 Trigger s 与 Property="Button.IsFocused" Value="False"不会被触发,所有Trigger s 与 Property="Button.IsFocused" Value="True"总会被触发。

不幸的是,我什至不知道从哪里开始研究如何实现这一目标。因此,对于我可以开始研究的地方的任何提示也将不胜感激。

最佳答案

概括

似乎您想实现将聚焦样式设置为与非聚焦样式相同,而不需要编辑主题并以独立于主题的方式进行。据我所知,这是不可能的,主要是因为每个主题在技术上都可以实现ListBoxItem以不同的方式关注行为。事实上,我见过一个主题,其中您想要的行为是 ListBoxItem 的行为!

如何修改主题

现在,如果您愿意修改每个主题以满足您的需求,请提前阅读。

如果您要全局修改主题,则可以编辑 ListBoxItem 的样式。直接(在找出它存在的位置后)。如果您希望更具体地应用更改,那么您最终将复制当前 ListBoxItem样式(来自您正在编辑的任何主题)并对其进行更改。

默认 ListBoxItem 主题的副本如下(我使用 Visual Studio 制作副本)。对于每个主题,您需要更改的内容会略有不同,但总体思路是相同的。

<Style x:Key="FocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<SolidColorBrush x:Key="Item.MouseOver.Background" Color="#1F26A0DA"/>
<SolidColorBrush x:Key="Item.MouseOver.Border" Color="#a826A0Da"/>
<SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="#3DDADADA"/>
<SolidColorBrush x:Key="Item.SelectedInactive.Border" Color="#FFDADADA"/>
<SolidColorBrush x:Key="Item.SelectedActive.Background" Color="#3D26A0DA"/>
<SolidColorBrush x:Key="Item.SelectedActive.Border" Color="#FF26A0DA"/>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="Padding" Value="4,1"/>
<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="1"/>
<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}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.MouseOver.Background}"/>
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.MouseOver.Border}"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsSelectionActive" Value="False"/>
<Condition Property="IsSelected" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Background}"/>
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Border}"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsSelectionActive" Value="True"/>
<Condition Property="IsSelected" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Background}"/>
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Border}"/>
</MultiTrigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

关键部分在中间:

<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsSelectionActive" Value="False"/>
<Condition Property="IsSelected" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Background}"/>
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Border}"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsSelectionActive" Value="True"/>
<Condition Property="IsSelected" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Background}"/>
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Border}"/>
</MultiTrigger>

这是在聚焦和未聚焦时为所选项目设置两种不同的样式。

要获得您想要的行为,您有两个选择之一;你可以简单地把它变成一个简单的触发器 IsSelected ,将上面的块替换为:

<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Background}"/>
<Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Border}"/>
</Trigger>

或者您可以更改 Item.SelectedInactive.BackgroundItem.SelectedInactive.Border匹配事件颜色的属性(这是在 ListBox 样式之上):

<SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="#3D26A0DA"/>
<SolidColorBrush x:Key="Item.SelectedInactive.Border" Color="#FF26A0DA"/>
<SolidColorBrush x:Key="Item.SelectedActive.Background" Color="#3D26A0DA"/>
<SolidColorBrush x:Key="Item.SelectedActive.Border" Color="#FF26A0DA"/>

通常首选第一种方法,因为它更清楚发生了什么。

附加约束

现在,上面复制默认主题的 ListBoxItem将为所有人更改它 ListBoxItem s。如果您只想更改一些,那么您需要为“复制样式”添加一个键,如下所示:

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

然后在您想要应用样式的某个级别(甚至可能只是一个 ListBox 本身),添加以下样式定义:

<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource InactiveLikeActive}" />

例如:

<ListBox>
<ListBox.Resources>
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource InactiveLikeActive}" />
</ListBox.Resources>
<ListBoxItem>One</ListBoxItem>
<ListBoxItem>Two</ListBoxItem>
</ListBox>

闭幕式

虽然 WPF 可以覆盖几乎所有的默认外观,但它并不一定使它变得容易或简单。

关于wpf - 在 WPF ListBox 中,如何将项目的聚焦选择样式 "copy"转换为非聚焦选择样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35890977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com