设置边框样式模板,但允许灵活使用值

2024-01-07

我有这个Border style:

<Border.Style>
    <Style x:Uid="Style_36" TargetType="Border">
        <Setter x:Uid="Setter_94" Property="BorderBrush" Value="Transparent"/>
        <Style.Triggers>
            <DataTrigger x:Uid="DataTrigger_36" Binding="{Binding SelectedItem, ElementName=comboActiveStudentAssignmentType}" 
                         Value="{x:Static StudentInfoEnums:StudentAssignmentType.Student1Main}">
                <Setter x:Uid="Setter_95" Property="BorderBrush" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Border.Style>

我知道如何将样式放入Window.Resources然后将其应用于任何控件。但我需要调整每个实例。文中:

<Border.Style>
    <Style x:Uid="Style_36" TargetType="Border">
        <Setter x:Uid="Setter_94" Property="BorderBrush" Value="Transparent"/>
        <Style.Triggers>
            <DataTrigger x:Uid="DataTrigger_36" Binding="{Binding SelectedItem, ElementName=comboActiveStudentAssignmentType}" 
                         Value="{x:Static StudentInfoEnums:StudentAssignmentType.Student1Main}">
                <Setter x:Uid="Setter_95" Property="BorderBrush" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Border.Style>

这一点:

值=“{x:静态StudentInfoEnums:StudentAssignmentType。学生1主要}">

需要为每个改变Border在窗户上。那么,如何设置样式来简化代码但允许更改此属性呢?

可能的?

Update

由于每个边框只应在组合为特定值时显示,并且建议是将所有数据触发器放入样式模板中,因此我开始尝试:

<Style x:Uid="Style_38" x:Key="StudentAssignmentFocusedBorder" TargetType="Border">
    <Setter x:Uid="Setter_94" Property="BorderBrush" Value="Transparent"/>
    <Style.Triggers>
        <MultiDataTrigger x:Uid="MultiDataTrigger_5">
            <MultiDataTrigger.Conditions>
                <Condition x:Uid="Condition_11" Binding="{Binding SelectedtItem, ElementName=comboActiveStudentAssignmentType}" Value="{x:Static StudentInfoEnums:StudentAssignmentType.Student1Main}"/>
                <Condition x:Uid="Condition_12" Binding="{Binding Name, Mode=OneWay, RelativeSource={RelativeSource Self}}" Value="borderMainHallStudent1"/>
            </MultiDataTrigger.Conditions>
            <Setter x:Uid="Setter_95" Property="BorderBrush" Value="Red"/>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

但这是行不通的。


This NOT美丽但增强你的可能性,因为你可以绑定你的StudentInfoEnums:StudentAssignmentType.Student1Main-Enum.

一些随机演示-XAML去测试:

<Window x:Class="SelectButtonSample.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:SelectButtonSample"

        mc:Ignorable="d"        
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        Title="MainWindow" >
    <Grid Height="200">
        <StackPanel>
            <Button Content="Click me" Width="80" Height="20" >
                <i:Interaction.Behaviors>
                    <local:MyBorderBehavior MyEnumPropery="Two"/>
                </i:Interaction.Behaviors>
            </Button>
            <CheckBox Content="Click me" x:Name="chk">
                <i:Interaction.Behaviors>
                    <local:MyBorderBehavior MyEnumPropery="Three"/>
                </i:Interaction.Behaviors>
            </CheckBox>
            <ListView>
                <i:Interaction.Behaviors>
                    <local:MyBorderBehavior MyEnumPropery="One"></local:MyBorderBehavior>
                </i:Interaction.Behaviors>
              <ListViewItem Content="Item1">
                    <i:Interaction.Behaviors>
                        <local:MyBorderBehavior MyEnumPropery="Four"></local:MyBorderBehavior>
                    </i:Interaction.Behaviors>
                </ListViewItem>
                <ListViewItem>Item 2</ListViewItem>
                <ListViewItem>Item 3</ListViewItem>
                <ListViewItem>Item 4</ListViewItem>
            </ListView>

        </StackPanel>
    </Grid>
</Window>

我的演示枚举:

public enum MyEnum
    {
        One,
        Two,
        Three,
        Four

    }

The Magic:

public class MyBorderBehavior : Behavior<Control>
    {
        public MyEnum MyEnumPropery {
            get { return (MyEnum) GetValue(MyEnumProperyProperty); }
            set { SetValue(MyEnumProperyProperty, value); }
        }

        public static readonly DependencyProperty MyEnumProperyProperty = DependencyProperty.Register("MyEnumPropery", typeof(MyEnum), typeof(MyBorderBehavior), new PropertyMetadata(PropertyChangedCallback));

        private static void PropertyChangedCallback(DependencyObject dO, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            var self = dO as MyBorderBehavior;
            if (self != null && self._controlToColorBorder != null)
                self.SetColor();
        }

        private Control _controlToColorBorder;

        private void SetColor()
        {
            switch (this.MyEnumPropery)
            {
                case MyEnum.One:
                    this._controlToColorBorder.BorderBrush = Brushes.Yellow;
                    break;
                case MyEnum.Two:
                    this._controlToColorBorder.BorderBrush = Brushes.Red;
                    break;
                case MyEnum.Three:
                    this._controlToColorBorder.BorderBrush = Brushes.Green;
                    break;
                case MyEnum.Four:
                    this._controlToColorBorder.BorderBrush = Brushes.DeepPink;
                    break;
            }
        }

        protected override void OnAttached()
        {
            this._controlToColorBorder = this.AssociatedObject;
            this._controlToColorBorder.Loaded += ControlToColorBorderLoaded;
            base.OnAttached();
        }

        private void ControlToColorBorderLoaded(object sender, RoutedEventArgs e)
        {
            this.SetColor();
        }
    }

Notes:

  • 正如你所看到的,你必须使用System.Windows.Interactivity-集会
  • 这个小Behavior可以应用于所有类型Control(因为控制有BorderBrush-财产)
  • 我已经实现了DependencyProperty使事物可绑定。
  • 四个你的目的,你肯定要更换MyEnum与你的和 调整颜色。此外,您可能需要实施另一个DependencyProperty将你的第二个条件带入行为中。

希望这能为您提供有关如何继续编写代码的线索。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设置边框样式模板,但允许灵活使用值 的相关文章

  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐