草庐IT

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

coder 2024-05-27 原文

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

  • 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# - WPF 自定义控件构造、触发器和事件的更多相关文章

  1. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  2. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  3. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  4. ruby-on-rails - 如何在 Rails Controller Action 上触发 Facebook 像素 - 2

    我有一个ruby​​onrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素

  5. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  6. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  7. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  8. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  9. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐