【问题标题】:WPF Window Style Bind to static property of non-static classWPF 窗口样式绑定到非静态类的静态属性
【发布时间】:2019-10-08 15:13:30
【问题描述】:

我正在尝试将边框画笔颜色绑定到实用程序文件的管理属性。引用非静态类中的静态类的静态属性的语法是什么?

<Window x:Class="Company.FieldServiceManagement.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:local="clr-namespace:FieldServiceManagement"
        xmlns:util="clr-namespace:Company.Utilities;assembly=Comp_Utilities"
        mc:Ignorable="d"
        Title="Field Service Management - Stand Alone" Height="750" MinHeight="500" Width="950" MinWidth="950">
    <Window.Resources>
        <util:ApplicationVariables x:Key="apv" />
    </Window.Resources>
    <Window.Style>
        <Style TargetType="{x:Type Window}">
            <Setter Property="BorderThickness" Value="3"/>
            <Setter Property="BorderBrush" Value="{Binding Source={StaticResource apv}, Path=Colors.Management}"/>
        </Style>
    </Window.Style>
    <Grid>
        <ContentControl x:Name="mainContentControl"/>
    </Grid>
</Window>

来自实用程序 DLL 程序集:

namespace Company.Utilities
{
    public class ApplicationVariables
    {
        public static class Colors
        {
            public static Color Employee { get; } = Color.FromArgb(192, 255, 192);
            public static Color Management { get; } = Color.FromArgb(255, 224, 192);
            public static Color HumanResources { get; } = Color.FromArgb(255, 192, 192);
            public static Color Payroll { get; } = Color.FromArgb(192, 255, 255);
            public static Color Rerpoting { get; } = Color.FromArgb(255, 192, 255);
        }
    }
}

更新

这种差异,虽然在外界看来似乎很小,但潜在的重复帖子是一个简单的结构:非静态类 -> 静态属性,而我的情况是:非静态类 -> 静态类 -> 静态财产。引用方法不像潜在的重复帖子那样简单。

更新 #2

由于 ASh 发现了类型问题,因此创建了一个扩展以将绘图颜色转换为媒体颜色,然后创建并引用了 SolidColorBrush。

public static wpf.Color ColorDrawingToMedia(this Color color)
{
    return wpf.Color.FromArgb(color.A, color.R, color.G, color.B);
}
----
public static WPF.SolidColorBrush ManagementBrush = new WPF.SolidColorBrush(Management.ColorDrawingToMedia());
----
<Setter Property="BorderBrush" Value="{x:Static util:ApplicationVariables+Colors.ManagementBrush}"/>

【问题讨论】:

  • 我最初尝试过,然后与许多其他场景一起发布。没有运气并且厌倦了敲我的头,我创建了这个帖子,而不是通过 cmets 劫持另一个线程。与使用 Color 相比,SolidColorBrush 类型的问题似乎更多。
  • 建议的副本中有大量信息,您的问题中没有任何内容表明您实际上尝试了所有方法。绑定到静态属性并不难。你试过{x:Static}this answer 一样吗?没有好的minimal reproducible example,就无法知道你做错了什么。
  • 您在问题中注意到的差异根本没有差异。所有属性都存在于 some 类中,绑定静态属性不依赖于哪个类,也不依赖于该类是否为静态。 “引用方法”与建议的副本一样简单。
  • 嵌套静态引用的语法与“+”不一样。是的,我尝试了源/路径引用。不应该仅仅因为张贴者没有说“我尝试了所有方法”就认为他们还没有进行大量研究并尝试了您链接的许多方法。是的,我已经看到并尝试过这些。 20 多年以来,我的最后一步是在进行详尽的研究后发布,而不是第一件事。
  • “人们不应该仅仅因为海报没有说“我尝试了所有的东西”就认为他们还没有进行大量研究” -- 如果您曾经在 Stack Overflow 上花费大量时间回答其他人的问题,您就会知道这是完全错误的。 99.94% 的时间,问题的作者实际上没有进行任何任何搜索,更不用说任何形式的彻底研究,以证明他们发布问题是正当的。虽然直接静态属性问题在这里可能不适用,但我仍然认为您不是第一个遇到这个问题的人,也不是问这个问题的人。

标签: wpf static bind


【解决方案1】:

您不需要任何类的实例来访问static 成员。

此外,Colors 属性似乎没有改变,因此您可以使用 {x:Static} 扩展名代替 Binding

<Setter Property="BorderBrush" Value="{x:Static util:ApplicationVariables+Colors.Management}"/>

ApplicationVariables+Colors 语法意味着 Colors 是 ApplicationVariables 中的嵌套类型


BorderBrush 需要 Brush 类型的值,而不是 Color。您可以创建 SolidColorBrushes:

public class ApplicationVariables
{
    public static class Colors
    {
        public static Brush Employee { get; } = new SolidColorBrush(Color.FromArgb(192, 255, 192));
        public static Brush Management { get; } = new SolidColorBrush(Color.FromArgb(255, 224, 192));
        public static Brush HumanResources { get; } = new SolidColorBrush(Color.FromArgb(255, 192, 192));
        public static Brush Payroll { get; } = new SolidColorBrush(Color.FromArgb(192, 255, 255));
        public static Brush Rerpoting { get; } = new SolidColorBrush(Color.FromArgb(255, 192, 255));
    }
}

【讨论】:

  • 谢谢。那就是朝着正确的方向发展。现在似乎可以识别颜色并显示一条消息:无法识别或无法访问成员“管理”。
  • @Galactic,我收到“无效的成员类型:加速类型 'Brush',实际类型是 'Color'”。查看我的编辑
猜你喜欢
  • 2014-01-29
  • 2015-10-15
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多