c# - WPF 自定义控件构造、触发器和事件

标签 c# .net wpf wpf-controls custom-controls

我想构建一个新的自定义控件。我发现很少有教程能给我一些关于如何实现这一目标的线索。据我了解,创建新的自定义控件总是通过扩展当前控件来完成的,甚至可以扩展 来自层次结构最基本级别的控件,例如,您甚至可以扩展:

  • UI元素
  • 框架元素
  • 控制
  • 内容控制
  • 标题内容控件
  • 项目控制
  • 选择器
  • 范围基准

如以下教程中所写:http://wpftutorial.net/HowToCreateACustomControl.html

因此,我按照教程创建了一个自定义控件库类型的新项目,得到了我的通用 .xaml 和我的代码。到目前为止一切顺利。

我可以区分 3 种类型或类别的事件。

  1. 将由将使用我的控件的窗口(或容器)使用的事件:这些是我想向外部公开的事件。怎么写?

  2. 与控件本身相关且不暴露于外部的事件; 例如,如果鼠标在我的控制范围内并且我想使用react 到那个。我可以在 XAML 中做到这一点:

    <ControlTemplate.Triggers>
      <Trigger Property="IsMouseOver" Value="true">  
        <Setter Property="Fill" TargetName="LeftTraingularIndicator">  
          <Setter.Value>  
            <SolidColorBrush Color="Yellow" />  
          </Setter.Value>  
        </Setter>
      </Trigger>
    </ControlTemplate.Triggers>  
    

假设我的元素中有一个具有 fill 属性的元素 名为 x:name="LeftTraingularIndicator"

的 ControlTemplate

问题:

现在我想在我的 XAML 中对 IsMouseDown 使用react。我怎么做? 没有“IsMouseDown”触发器。此外,如果我想要怎么办 在后面的代码中对此使用react?更进一步,如果我想要 从后面的代码更改 LeftTraingularIndicator“Fill”?

  1. 与属于视觉部分的子元素相关的事件 构建我的 ControlTemplate,例如,如果我想使用react怎么办 到 XAML 中的“LeftTraigularIndicator”的“IsMouseOver”/甚至代码隐藏? 甚至两者兼而有之。

我现在已经尝试了 2 天...感觉我在理解事物的运作方式时遗漏了一些东西。没有找到任何深入解释这些问题的教程。

对于我在此处提出的每个问题,我希望看到几行示例。

谢谢。

最佳答案

经过广泛的研究...

1) 将事件暴露给外部... 就好像您正在从任何其他类(class)中展示一样。

public delegate void myDelegate(int someValue);  
public event myDelegate myEvent;

以及您代码中的某处:

if(myEvent!=null)
  myEvent(5);

那部分没有新内容。

2) 从后面的代码创建一个实例构造器

public MyCustomControl()
{
    MouseMove += MyCustomControl_MouseMove;
}


void MyCustomControl_MouseMove(object sender, MouseEventArgs e)
{
   //now you can react to the movement of the mouse.
   //if for example I want to address an element, let's say a rectangle:

   var ele = (Rectangle)Template.FindName("myRect",this);
   ele.Fill=myNewBrush;

   // provided that we have an element named "myRect" (x:name="myRect") in
   // the generic.xaml style->Control Template-> which corresponds to that name.

}

3) 不推荐 - 因为它属于用户控件的范围而不是自定义控件。 自定义控件是“原子”,更适合用户控件的目的 组合控件。

但并非不可能...

var myButton = (Button)Template.FindName("myButton",this);
myButton.OnMouseMove += ....

请记住:

  • 代码隐藏中应该知道的任何内容都必须命名。

  • 您的 xaml 应该不知道后面的代码在做什么。 (除了! - 继续阅读)

  • 应该在代码隐藏中知道的部分必须有正确的名称 您设计自己的 XAML。

我真的希望这能帮助那些在尝试开发时遇到“墙”的人 他们自己的自定义控件。

关于c# - WPF 自定义控件构造、触发器和事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14951435/

相关文章:

c# - 无法填充组合框

c# - 我正在逐步调试 Visual Studio 2010 中的应用程序,有一次它跳转到代码的意外部分。这是一个错误吗?

c# - 快速重复 TakeWhile 导致无限循环

c# - 为什么 "SerialNumber"类的 "Win32_CDROMDrive"属性在与 WMI 分开请求时返回 null?

.net - 为什么我不能在事件触发器中放置一个 Setter

WPF 使用名称删除网格布局子项

c# - Stripe API - 基于元数据的搜索

c# - 即使定义了 ID 也无法获取文本框

.net - 由于 CSPack 找不到文件而导致 TFS 构建失败

c# - WPF绑定(bind)问题