RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1587354
Accepted
Pavel
Pavel
Asked:2024-07-16 22:22:00 +0000 UTC2024-07-16 22:22:00 +0000 UTC 2024-07-16 22:22:00 +0000 UTC

更改组合框背景

  • 772

是否可以通过简单的方式设置唯一的 ComboBox 背景颜色,以及多个 ComboBox 的下拉列表背景颜色?我找到了一个可以更改系统颜色的选项,但在这种情况下,颜色会同时为每个人更改,而不是为某个特定的颜色更改。或者标准的 ComboBox 中没有这样的东西,你需要自己编写?

c#
  • 1 1 个回答
  • 59 Views

1 个回答

  • Voted
  1. Best Answer
    EvgeniyZ
    2024-07-17T03:32:53Z2024-07-17T03:32:53Z

    我将向您展示一个简单的示例,说明您应该具备什么,然后根据您的需要进行调整。

    让我们在屏幕上有 2 个ComboBox,其中一个负责另一个的“状态”,而另一个则根据这些数据改变其颜色。

    数据

    由于 WPF 是关于绑定并将数据与 UI 分离的,所以我们根本不应该做这样的事情comboBox1.Backgroud = ...;,这是不正确的,因为我们正在干扰来自 UI 的数据。那么,我们如何描述这些颜色、某些“状态”呢?一切都很简单,创建一个enum具有简单值和清晰名称的值。事实上,我们就这么做吧。让我们有enum,我们称之为Status,并让它有标准值“正常”,“成功”,“注意”,“错误”,我们会得到这样的东西:

    public enum Status
    {
        Normal,
        Success,
        Warning,
        Error
    }
    

    现在,让我们画出一个简单的类(ViewModel),它将包含 this enum,以及 this 的所有值的列表enum,以及 的值的集合ComboBox。由于状态本身enum(我们的状态)必须在程序运行时发生变化,因此它必须调用INPC,不要忘记这一点,否则 UI 将不会接收到更改!
    结果,我的代码将是这样的:

    public partial class MainViewModel : ObservableObject
    {
        public string[] Values => [ "Value 1", "Value 2", "Value 3", "Value 4", "Value 5" ];
        public Status[] Statuses => Enum.GetValues<Status>();
    
        [ObservableProperty]
        private Status _status = Status.Normal;
    }
    

    这个不用ObservableProperty理会ObservableObject,为了简单起见我用的CommunityToolkit.Mvvm,它给我生成的是一样的INotifyProprtyChanged,你在这里有权做你想做的事,主要是调用INPC,它的实现并不是那么重要。

    XAML

    我们已经完成了数据处理,现在我们需要处理 UI。我们现在的任务本质上很简单,但是XAML 中的if (Status == Warning) Background = Red;等效项是什么?if没错,就是触发器。实际上,我们的任务是将样式更改ComboBox为每个状态都有触发器的样式。最终结果将是这样的:

    <StackPanel
        HorizontalAlignment="Center"
        VerticalAlignment="Center"
        Orientation="Horizontal">
        <ComboBox ItemsSource="{Binding Statuses}" SelectedItem="{Binding Status}" />
        <ComboBox ItemsSource="{Binding Values}" SelectedIndex="0">
            <ComboBox.Style>
                <Style TargetType="ComboBox">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Status}" Value="Success">
                            <Setter Property="Background" Value="{DynamicResource SystemFillColorSuccessBrush}" />
                            <Setter Property="Foreground" Value="{DynamicResource TextOnAccentFillColorPrimaryBrush}" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Status}" Value="Warning">
                            <Setter Property="Background" Value="{DynamicResource SystemFillColorCautionBrush}" />
                            <Setter Property="Foreground" Value="{DynamicResource TextOnAccentFillColorPrimaryBrush}" />
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Status}" Value="Error">
                            <Setter Property="Background" Value="{DynamicResource SystemFillColorCriticalBrush}" />
                            <Setter Property="Foreground" Value="{DynamicResource TextOnAccentFillColorPrimaryBrush}" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ComboBox.Style>
        </ComboBox>
    </StackPanel>
    

    还是那句话,不要讲究各种颜色TextOnAccentFillColorPrimaryBrush,我用我自己的颜色,你自然会有你自己的。另请注意,在触发器中我指示了要更改的所有必要值。
    因此,如果您正确执行了所有操作,请运行它并查看结果:

    结果1

    有问题吧?我们的控件失去了标准样式,但是为什么呢?重点是,我们现在基本上已经做了类似的事情comboBox1.Style = новый стиль,但“新风格”本身是空的,里面什么也没有。在需要添加到基类的情况下该怎么办?没错,如果他们允许,我们就继承,也就是我们去做новый стиль : старый стиль。在 XAML 中,您还可以继承样式;这是通过BaseOn.实际上,我们将其添加到此<Style TargetType="ComboBox">属性中,指示应从中继承的资源(名称/类型)。由于我们需要一个标准的类型,因此我们需要通过 绑定到所需的类型StaticResource,即BasedOn="{StaticResource {x:Type ComboBox}}"。
    我们再次运行该项目,你瞧,一切正常:

    结果2

    现在切换状态并欣赏结果:

    成功 警告 错误

    正如您所看到的,一切正常,XAML 自动调整为绑定属性的值。
    但请记住,如果您要添加到基本样式,那么值得研究它,否则您可能会错过一些东西并最终出现各种“故障”,例如,我有,当更改颜色时,鼠标悬停时颜色不会改变:

    XAML问题

    但这是一个完全不同的故事......
    这实际上是根据数据中的某些内容更改 UI 中的某些内容的基本且最简单(正确)的方法之一。然后将其适应您的项目,在问题中我看到您谈论下拉列表的背景,因此尝试为它写一个触类旁通的样式。

    顺便说一下,我没有完全理解你的问题,即“独特的颜色”。如果您需要为每个创建的颜色创建完全唯一的颜色ComboBox,那么这种情况下的“颜色”已经是特定对象的特定数据,这意味着您需要创建一个类来描述特定对象并存储“ color”属性,然后你只需绑定这个属性ComboBox就可以了。事实上,在我看来,为每个 UI 组件提供“独特”的颜色已经是应用程序的糟糕用户体验,这只会分散用户的注意力。

    • 4

相关问题

  • 使用嵌套类导出 xml 文件

  • 分层数据模板 [WPF]

  • 如何在 WPF 中为 ListView 手动创建列?

  • 在 2D 空间中,Collider 2D 挂在玩家身上,它对敌人的重量相同,我需要它这样当它们碰撞时,它们不会飞向不同的方向。统一

  • 如何在 c# 中使用 python 神经网络来创建语音合成?

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5