WPF 用户控件;触发器和更改其他控件

2024-06-26

我创建了一个 WPF UserControl,其中包含一个按钮和一个组合框。我想根据鼠标的位置更改两者的样式,因此鼠标悬停的 UIElement 的颜色为黑色,另一个的颜色为红色。如果两者均未设置样式,则将应用默认样式。

别担心,这个噩梦般的配色方案只是为了说明这个概念!

在此先感谢您的帮助。

XAML

<UserControl x:Class="WpfUserControlSample.ToolbarButtonCombo"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfUserControlSample"
             x:Name="Control"
             mc:Ignorable="d" 
             d:DesignHeight="30">    
    <UserControl.Resources>
        <Style TargetType="{x:Type local:ToolbarButtonCombo}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsButtonMouseOver}" Value="True">
                    <Setter Property="ButtonStyle" Value="Black"/>
                    <Setter Property="ComboStyle" Value="Red"/>                    
                </DataTrigger>
                <!--
                <DataTrigger Binding="{Binding IsComboMouseOver}" Value="True">
                    <Setter Property="ButtonStyle" Value="Red"/>
                    <Setter Property="ComboStyle" Value="Black"/>
                </DataTrigger>
                -->
            </Style.Triggers>
        </Style>
    </UserControl.Resources>
    <StackPanel Orientation="Horizontal" Height="30">
        <Button Name="btn" Background="{Binding ButtonStyle,ElementName=Control,Mode=OneWay}">
            Test
        </Button>
        <ComboBox Name="cmb" Background="{Binding ComboStyle,ElementName=Control,Mode=OneWay}"></ComboBox>
    </StackPanel>
</UserControl>

代码隐藏:

namespace WpfUserControlSample
{
    public partial class ToolbarButtonCombo : UserControl, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

        }  
        public ToolbarButtonCombo()
        {
            InitializeComponent();
            btn.MouseEnter += new MouseEventHandler(btn_MouseChanged);
            btn.MouseLeave += new MouseEventHandler(btn_MouseChanged);
        }
        void btn_MouseChanged(object sender, MouseEventArgs e)
        {
            OnPropertyChanged("IsButtonMouseOver");
        }


        public bool IsButtonMouseOver
        {
            get { return btn.IsMouseOver; }

        }
        public static readonly DependencyProperty IsButtonMouseOverProperty =
            DependencyProperty.Register("IsButtonMouseOver", typeof(string), typeof(ToolbarButtonCombo), new PropertyMetadata("false"));

        public string ButtonStyle { get; set; }
        public static readonly DependencyProperty ButtonStyleProperty =
            DependencyProperty.Register("ButtonStyle", typeof(string), typeof(ToolbarButtonCombo));

        public string ComboStyle { get; set; }
        public static readonly DependencyProperty ComboStyleProperty =
            DependencyProperty.Register("ComboStyle", typeof(string), typeof(ToolbarButtonCombo));    
    }
}

有两个问题。

首先,您的 DataTrigger 绑定看起来不正确。他们正在 DataContext 上查找 IsButtonMouseOver,而不是关联的控件。你需要使用:

<DataTrigger Binding="{Binding IsButtonMouseOver, RelativeSource={RelativeSource Self}}" Value="True">
    <Setter Property="ButtonStyle" Value="Black"/>
    <Setter Property="ComboStyle" Value="Red"/>                    
</DataTrigger>

Or:

<Trigger Property="IsButtonMouseOver" Value="True">
    <Setter Property="ButtonStyle" Value="Black"/>
    <Setter Property="ComboStyle" Value="Red"/>                    
</Trigger>

另一个是你的 IsButtonMouseOver 没有正确实现。你应该做类似的事情:

public static readonly DependencyProperty IsButtonMouseOverProperty = DependencyProperty.Register("IsButtonMouseOver",
    typeof(bool), typeof(ToolbarButtonCombo), new PropertyMetadata(false));

    public bool IsButtonMouseOver
    {
        get { return (bool)this.GetValue(IsButtonMouseOverProperty); }
        set { this.SetValue(IsButtonMouseOverProperty, value); }
    }

    void btn_MouseChanged(object sender, MouseEventArgs e)
    {
        this.IsButtonMouseOver = this.btn.IsMouseOver;
    }

或者更正确的是,将 IsButtonMouseOver 设为只读依赖属性,如下所示:

private static readonly DependencyPropertyKey IsButtonMouseOverPropertyKey = DependencyProperty.RegisterReadOnly("IsButtonMouseOver",
    typeof(bool), typeof(ToolbarButtonCombo), new FrameworkPropertyMetadata(false));

public static readonly DependencyProperty IsButtonMouseOverProperty = ToolbarButtonCombo.IsButtonMouseOverPropertyKey.DependencyProperty;

public bool IsButtonMouseOver {
    get { return (bool)this.GetValue(IsButtonMouseOverProperty); }
    private set { this.SetValue(IsButtonMouseOverPropertyKey, value); }
}

您的其他属性(ButtonStyle 和 ComboStyle)也需要正确实现,并且它们的 get/set 方法不受依赖属性支持。

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

WPF 用户控件;触发器和更改其他控件 的相关文章

  • 以 ISO 8601 格式输出日期

    如何在 C 中获取以下格式的日期 2016 04 26T19 50 48Z include
  • 求 a 范围内的 pow(a^b)modN

    对于给定的b and N以及一系列a say 0 n 我需要找到ans 0 n 1 where ans i 没有a s为此pow a b modN i 我在这里搜索的是可能的重复pow a b modN对于一系列a 以减少计算时间 例子 i
  • HTML 文档

    有没有一个工具可以从 VS2010 生成的 XML 文档文件生成 HTML 页面 我在谷歌上搜索了这样的工具 但没有找到 我下载并安装了SandCastle 但我不明白如何使用它 尝试使用Sandcastle 帮助文件生成器 http sh
  • 在子目录中构建共享库

    我正在尝试构建一个使用一些 C 代码的 R 包 我有一个编译为可执行文件的 C 库 可以从命令行调用 有一个与之关联的 Makefile 我正在尝试获取信息here http cran r project org doc manuals R
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • 如何将 QSerialPort 模块添加到 CMake 中?

    我想将 QSerialPort 模块添加到 CMake 中 根据我的理解 我需要将QT 串口添加到 pro中 我只想使用 CMake 所以我尝试编译简单的 CMake 文件 但有错误 QtCore 正在工作 qDebug 可以毫无问题地显示
  • 测试从 ComboBox 派生的自定义控件

    我创建了一个从 ComboBox 派生的控件 并希望对其行为进行单元测试 但是 它在我的单元测试中的行为似乎与实际应用程序中的行为不同 在实际应用程序中 Combobox DataSource 属性和 Items 同步 换句话说 当我更改
  • 如何在 WCF 中反序列化自定义 SOAP 标头?

    我正在尝试向通过 WCF 的所有 SOAP 请求添加自定义标头 我发现这篇精彩的文章 http blogs msdn com b mohamedg archive 2012 10 21 adding custom soap headers
  • argc 和 argv 在 Windows 中没有用吗?

    在 Linux 中 argc 和 argv 计算终端中的参数 但在 Windows 中 我找不到放置第二个参数的地方 事实上 每次我运行该程序时 它都会创建那个丑陋的黑色窗口 我什至没有机会给出任何争论 那么这两个变量在Windows平台下
  • OpenMP 循环数组访问中的错误共享

    我想利用 OpenMP 来并行执行我的任务 我需要将数组的所有元素减去相同的数量并将结果写入另一个向量中 两个数组都是动态分配的malloc第一个填充了文件中的值 每个元素都有类型uint64 t pragma omp parallel f
  • 如何在 C++ 中初始化嵌套类的构造函数

    我在初始化嵌套类构造函数时遇到问题 这是我的代码 include
  • 内存不足异常

    我正在使用 C 和 asp net 开发一个网络应用程序 我一直收到内存不足的异常 该应用程序的作用是从数据源读取一堆记录 产品 可能是数百 数千 通过向导中的设置处理这些记录 然后使用处理的产品信息更新不同的数据源 虽然有多个 DB 类
  • 剥离 OLE 标头信息 (MS Access / SQL Server)

    我有一个 C 应用程序需要支持二进制数据库内容 图像等 当使用 MS Access 或 MS SQL Server 时 此数据被包装在 OLE 对象内 如何去除此 OLE 标头信息 请注意 我不能只查找特定标签的开头 因为内容可以是 png
  • 除法时的小数舍入误差 (C#)

    我基本上有四个数字 比如 100 200 300 400 我需要计算概率为 100 100 200 300 400 200 100 200 300 400 等等在 当我使用小数数据类型来存储这些概率时 由于舍入问题 它们不会达到 1 在不使
  • 链接错误:xxx 已在 *****.LIB 中定义:: 究竟出了什么问题?

    Problem 我正在尝试使用一个名为DCMTK http dicom offis de dcmtk它使用了一些其他外部库 zlib libtiff libpng libxml2 libiconv 我已经从同一网站下载了这些外部库 LIB
  • 在 C# 中为 ListBox 分配数据源时,如何从 ListBox 中删除所选项目?

    在 C 中为 ListBox 分配数据源时 如何从 ListBox 中删除所选项目 尝试删除时出现错误 设置 DataSource 属性后 无法修改项目集合 但是当我尝试从数据源 数据表 中删除项目时 它会抛出错误 因为 数据行不在当前行集
  • 如何以一对一/零关系更新员工和身份用户

    我正在尝试更新员工记录 也想更新身份用户 如果我先单独更新身份用户 例如 UserManager Update user Context Entry employee State System Data Entity EntityState

随机推荐

  • C 中的联合与结构

    这个问题背后的想法是理解使用 union 的更深层次概念并以不同的方式使用它以节省内存 我对所有人的问题是 假设有一个结构 struct strt float f char c int a 和联合中表示的相同结构 union unin fl
  • NSAttributedString '\n' 被忽略

    我有一个视图 其唯一的 UI 元素是UITextView In viewDidLoad 我使用 Text n 创建一个属性字符串 并将文本视图的属性文本设置为 NSAttributedString string NSAttributedSt
  • Python 3.2 中的十六进制解码

    在 Python 2 x 中我可以这样做 gt gt gt 4f6c6567 decode hex codec Oleg 但在Python 3 2中我遇到了这个错误 gt gt gt b 4f6c6567 decode hex codec
  • 获取每件商品的最新价格

    我有一张桌子 ItemID PurchaseDate Price 001 03 17 2013 19 00 002 03 17 2013 14 00 001 03 18 2013 13 00 002 03 18 2013 15 00 001
  • MVC WebGrid 设置渲染的ID

    使用 MVC 3 中的 WebGrid 如何在呈现时指定控件的名称 即呈现时表的 id var someGrid new WebGrid source Model Users defaultSort Name rowsPerPage 50
  • android - 将水平viewpager与垂直viewpager结合起来

    我想将默认的水平 ViewPager 与某种垂直ViewPager https stackoverflow com questions 13477820 android vertical viewpager 我的方法是水平 ViewPage
  • 测试 Spyne 应用程序

    测试 Spyne 应用程序的最佳实践是什么 有没有类似的测试客户端Django https docs djangoproject com en 1 5 topics testing overview module django test c
  • 根据不规则数据绘制曲面

    我正在从分散的数据集中绘制填充轮廓图或曲面图 与其他 Q 的主要区别在于数据不是凸的 r th meshgrid 10 15 0 180 x y deal r sind th r cosd th z x 2 y 2 scatter x y
  • 从 Etsy 商店获取所有列表图像

    情况 我一直在使用 Etsy 沙箱 API 来尝试为想要向所有 Etsy 列表显示默认图像和标题的客户找出解决方案 点击后 他们希望它引导他们离开网站并进入 Esty 列表页面 现在 弄清楚如何获取所有列表的名称和 url 很容易 并且可以
  • PHP 简化三元运算

    在 PHP 中 有没有一种方法可以进一步简化 而不使用if foo bar 0 foo 我想知道是否有办法不重新分配 foo如果条件满足 则返回到自身 我知道有一种方法可以在 Javascript 中做到这一点 使用 对吧 但我想知道是否有
  • 尝试在 Anaconda 中更新和使用 scipy 模块时出错

    我对 Python 比较陌生 一直在尝试将 Anaconda 更新到最新版本 很遗憾 scipy根本不会进口 今天我已经安装和卸载了 Anaconda 7 次 但没有成功 Here s sys version 3 6 6 Anaconda
  • 如何在 Keras Lambda Layer 中使用 OpenCV 函数?

    我正在尝试使用一个在图像上使用某些 OpenCV 函数的函数 但我得到的数据是张量 我无法将其转换为图像 def image func img img cv2 cvtColor img cv2 COLOR BGR2YUV img cv2 r
  • Redux:为什么避免突变是使用它的基本部分?

    我是 Redux 的新手 我真的很想了解使用函数式编程使单向数据更加优雅的全局 在我看来 每个减速器都采用旧状态 创建一个新状态而不改变旧状态 然后将新状态传递给下一个减速器以执行相同的操作 我知道不造成副作用可以帮助我们获得单向数据流的好
  • 单击 div 时更改复选框状态(真/假)

    我有一个带有图像 标签和输入复选框的 div 当我点击 div 时 我喜欢什么 它会将复选框状态从 true 更改为 false 并且反之亦然 jQuery markerDiv click function if this find inp
  • 在循环的setTimeout中使用IIFE,但是为什么呢? [复制]

    这个问题在这里已经有答案了 我知道这是一个经典的js问题 我的问题不是如何解决这个问题 而是IIFE如何解决这个问题 感谢其他答案链接 但我没有找到我想要的答案 for var i 0 i lt 5 i setTimeout functio
  • 追踪 int[] 的分配情况

    当查看我的remote通过 JMX 在 JVisualVM 中的应用程序中 我看到空闲时内存使用呈锯齿状 进行堆转储并使用 JVisualVM 进行分析 我发现很大一部分内存位于几个大的内存中int 没有引用的数组 通过比较堆转储 我可以看
  • 打印作为参数传递的函数指针会在屏幕上打印“1”

    我一直在尝试函数指针 发现以下程序的行为相当神秘 void foo int p std cout lt lt p lt lt std endl int alwaysReturns6 return 6 int main foo alwaysR
  • Visual C++ 只有一个线程工作 (OpenMP)

    我有一个多线程应用程序的简单代码 但无论我传递多少个线程 它都只使用一个线程执行 起初 我以为是我的电脑的问题 但我又尝试了另一台电脑 但还是不行 我是不是出了什么事 我正在使用 Visual Studio 2015 如果有帮助的话 int
  • 如何在 iOS 上使用 Expo.printToFileAsync 避免从 HTML 生成的输出 PDF 中内容部分内的分页符

    我正在创建一个应用程序 它在选项卡中包含完整的列表 并且这些列表包含其数据 同样是内部列表 我们可以将它们称为子列表 我使用 expo 来构建这个应用程序 并使用 expo print API 将这些列表转换为 PDF 当用户选择共享时 这
  • WPF 用户控件;触发器和更改其他控件

    我创建了一个 WPF UserControl 其中包含一个按钮和一个组合框 我想根据鼠标的位置更改两者的样式 因此鼠标悬停的 UIElement 的颜色为黑色 另一个的颜色为红色 如果两者均未设置样式 则将应用默认样式 别担心 这个噩梦般的