【请教】关于用户控件的Enabled属性设置

Haitani 2018-04-08 09:08:42
自己组合了一个用户控件myclock,由timer+label做的,用来实时显示当前时间,按照一般的使用习惯来说,myclock的Enabled属性应该用来控制时间的走或停,即myclock的Enabled是读写timer的Enabled,然后我就public new bool Enabled { get { return timer.Enabled; } set { timer.Enabled = value; } },问题来了,在控件属性窗口中对myclock的Enabled进行设置,即使myclock的Enabled=true,并不能直接看到时间的变化,只有在代码中设置才行,而我如果写一个自定义的IsStart属性却可以再属性窗口直接控制,原因是什么?怎么解决,请教


...全文
409 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Haitani 2018-04-08
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MyToolClass;

namespace TestClock
{
public partial class TestClock : UserControl
{
public new bool Enabled
{
get { return timer.Enabled; }
set { timer.Enabled = value; }
}

//自定义属性是否启动clock
public bool IsStart
{
get { return timer.Enabled; }
set { timer.Enabled = value; }
}

PictureBox[] picArr;
Image[] imgArr;
ZoomController zc = new ZoomController();

public TestClock()
{
InitializeComponent();
zc.BindMainControl(this);
}

private void TestClock_Load(object sender, EventArgs e)
{
picArr = new PictureBox[] { this.pic_HH, this.pic_H, this.pic_mm, this.pic_m, this.pic_ss, this.pic_s };
imgArr = new Image[] { Properties.Resources.number_000, Properties.Resources.number_001, Properties.Resources.number_002, Properties.Resources.number_003, Properties.Resources.number_004, Properties.Resources.number_005, Properties.Resources.number_006, Properties.Resources.number_007, Properties.Resources.number_008, Properties.Resources.number_009 };

for (int i = 0; i < picArr.Length; i++)
{
picArr[i].BackgroundImage = Properties.Resources.number_000;
}

this.pic_Colon1.BackgroundImage = Properties.Resources.number_colon;
this.pic_Colon2.BackgroundImage = Properties.Resources.number_colon;
}

private void time_Tick(object sender, EventArgs e)
{
string timeStr = DateTime.Now.ToString("HHmmss");
for (int i = 0; i < picArr.Length; i++)
{
string tmp = timeStr[i].ToString();
int num = Convert.ToInt32(tmp);
picArr[i].BackgroundImage = imgArr[num];
}
}

private void TestClock_Resize(object sender, EventArgs e)
{
zc.ChangeControlSize();
}
}
}


Haitani 2018-04-08
  • 打赏
  • 举报
回复
引用 7 楼 ducker3590 的回复:
[quote=引用 5 楼 Haitani 的回复:] [quote=引用 4 楼 ducker3590 的回复:] timer的Enabled默认是false 改成true
这个也不对,你在用户控件属性窗口设置Enabled为false时,用户控件的时间就应该停止,而不是F5启动后才停止, //自定义属性是否启动clock public bool IsStart { get { return timer.Enabled; } set { timer.Enabled = value; } } 我自己加的属性IsStart在属性窗口改为false时就可以直接停止时间走动,不需要F5启动 [/quote] 那你的程序是永远在设计窗口里用还是编译完了运行程序?[/quote] 这么说吧,比如我想做一个背景色,那么我肯定是在属性窗口就能选择并立刻看到效果,而不是我选完什么也看不到,只能运行才能看到,这样的使用体验肯定不好,也和传统的属性设置不一致,对不
Haitani 2018-04-08
  • 打赏
  • 举报
回复
引用 6 楼 xuzuning 的回复:
没有问题的
   public partial class myclock : Label
{
public myclock()
{
InitializeComponent();
timer.Tick += new EventHandler(timer_Tick);
timer.Enabled = true;
}

void timer_Tick(object sender, EventArgs e)
{
Text = DateTime.Now.ToString();
}
Timer timer = new Timer();
public bool Enabled { get { return timer.Enabled; } set { timer.Enabled = value; } }
}

前辈我说一下,我的问题有些简化了,其实我用的是6个picturebox和timer组成的控件,是继承了UserControl,不是Label,所以如果是继承UserControl的情况下,如何覆盖Enabled达到效果

Haitani 2018-04-08
  • 打赏
  • 举报
回复
引用 4 楼 ducker3590 的回复:
timer的Enabled默认是false 改成true
这个也不对,你在用户控件属性窗口设置Enabled为false时,用户控件的时间就应该停止,而不是F5启动后才停止, //自定义属性是否启动clock public bool IsStart { get { return timer.Enabled; } set { timer.Enabled = value; } } 我自己加的属性IsStart在属性窗口改为false时就可以直接停止时间走动,不需要F5启动
csdnFUCKINGSUCKS 2018-04-08
  • 打赏
  • 举报
回复
引用 5 楼 Haitani 的回复:
[quote=引用 4 楼 ducker3590 的回复:] timer的Enabled默认是false 改成true
这个也不对,你在用户控件属性窗口设置Enabled为false时,用户控件的时间就应该停止,而不是F5启动后才停止, //自定义属性是否启动clock public bool IsStart { get { return timer.Enabled; } set { timer.Enabled = value; } } 我自己加的属性IsStart在属性窗口改为false时就可以直接停止时间走动,不需要F5启动 [/quote] 那你的程序是永远在设计窗口里用还是编译完了运行程序?
xuzuning 2018-04-08
  • 打赏
  • 举报
回复
没有问题的
   public partial class myclock : Label
    {
        public myclock()
        {
            InitializeComponent();
            timer.Tick += new EventHandler(timer_Tick);
            timer.Enabled = true;
        }

        void timer_Tick(object sender, EventArgs e)
        {
            Text = DateTime.Now.ToString();
        }
        Timer timer = new Timer();
        public bool Enabled {  get { return timer.Enabled; } set { timer.Enabled = value; } }        
    }
csdnFUCKINGSUCKS 2018-04-08
  • 打赏
  • 举报
回复
timer的Enabled默认是false 改成true
Haitani 2018-04-08
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
不要写 new xxxxx 方法,这种语法是 c# 的糟粕,是严重破坏面向对象原则的。你应该使用 override 的方式来重写控件的 Enabled 属性,绝不使用 new 这类语法。
Enabled不是被virtual修饰的,怎么去override
  • 打赏
  • 举报
回复
不要写 new xxxxx 方法,这种语法是 c# 的糟粕,是严重破坏面向对象原则的。你应该使用 override 的方式来重写控件的 Enabled 属性,绝不使用 new 这类语法。
Haitani 2018-04-08
  • 打赏
  • 举报
回复

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧