【问题标题】:Custom control doesn't expose image properties in the Designer自定义控件不会在设计器中公开图像属性
【发布时间】:2011-08-22 05:35:59
【问题描述】:

我制作了一个自定义轨迹栏控件,主要是作为练习。我知道我可以/应该继承我需要的东西,而不是重新发明轮子,但我在努力中学到了很多东西。 现在,我有很多属性,除了几个图像属性之外,它们都显示在设计器中。这就是我所拥有的,以其他工作属性为模型(那些是整数和颜色等等,它们都按预期工作......),所以也许我应该以其他方式做图像。底线,我不知道我在做什么:)

编辑:我的自定义控件位于 Windows 窗体解决方案 (VC# 2008 Express) 中,澄清一下,我的问题是我的某些控件属性(图像属性)没有显示在设计时的属性选项卡中。

编辑 2: 在阅读了 DependencyProperty 之后完全无法理解这个概念(我对 programmin teh codez 非常陌生,或者你的大师称之为黑色巫术魔法??)。我已经习惯让 IDE 解决我所有的问题,我很高兴看到 IDE 愉快地显示我的其他属性,例如Color BarColorint Value 等。为什么Image LeftImage 会有所不同,a许多标准控件都有 Image 属性,也许我天真地认为 IDE 可以解决我所有的错误,但微软的人肯定不会在每次必须在他们的控制。我敢打赌,他们重用了一些东西,我应该也能做到。

我被困住了:(

这是我的蹩脚 CoD3Z:

private Image _LeftImage;

    /// <summary>
    /// Sets the small image appearing to the left of the trackbar
    /// </summary>

    [Description("The small image appearing to the left of the trackbar"),
    Category("Appearance"),
    DefaultValue(typeof(Image),"null"),
    Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]

    public Image LeftImage
    {
        private get { return _LeftImage; }
        set
        {
            if (value.Height != 16 || value.Width != 16)
            {
                _LeftImage = new Bitmap(value,new Size(16,16));
            }
            else _LeftImage = value;
            Invalidate();
        }
    }

顺便问一下,DefaultValue 和 DefaultValueAttribute 有什么区别?

感谢您的任何指点和帮助! /迈克尔

【问题讨论】:

  • “DefaultValue 和 DefaultValueAttribute 之间的区别” - 它们实际上是同一回事。当您向某事物添加属性时,您可以省略“属性”后缀。 [DefaultValue(...)] 创建 DefaultValueAttribute 类的实例。
  • 那么,我是不想创建一个实例,还是它已经实例化了?我会试试另一个看看;)
  • 好的,从您的解释中可以得出结论,从 DefaultValue 更改为 DefaultValueAttribute 并没有什么不同...
  • 好的,所以我找到了答案,但我无法回答自己的问题,因为我是新用户。无论如何,大多数(如果不是所有)微软类都包含一个编辑器,所以在我的情况下它应该很简单:msdn.microsoft.com/en-us/library/…>

标签: c# winforms properties custom-controls designer


【解决方案1】:

我在这里找到了一些东西: http://msdn.microsoft.com/en-us/library/system.drawing.design.imageeditor.aspx

认为这已解决。

【讨论】:

【解决方案2】:

您的示例没有显示您的问题到底是什么,但如果您创建自定义控件并希望从设计器访问其属性,您应该像这样使用 smth:

        public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(object), typeof(CustomControl),
        new FrameworkPropertyMetadata(null, ValueChanged));

希望对你有帮助

【讨论】:

  • 谢谢!我会研究你的建议。我不太明白 DependencyProperty 是什么以及它有什么用处。对于我的其他属性,这似乎很容易,它只是神奇地弹出属性列表,以及适当的颜色选择器和文本框。我认为图像属性也会自动显示,我的意思是我的控件不是第一个具有图像属性的控件,对吧?
  • 通过 DependencyProperty 在类中注册您的属性允许在 Xaml 中绑定到它
  • @mickey 我相信您可以像处理其他属性一样以类似的方式进行操作。我只是不知道如何......期待另一个答案。
  • @Dariusz Wickowski - 所以 DependencyProperty 是在 WPF 上下文中使用的东西,但可能不在我的 Windows 窗体项目 (VC# 2008 Express) 中,对吗?我试图阅读 DependencyProperty 和 FrameworkPropertyMetadata,但我就是不明白。
  • @mickey,没错——DependencyProperty 严格来说是 WPF 的东西。在您明确表示您正在使用 WinForms 之前发布了此答案(尽管如果您仔细观察很明显 - 您的代码示例调用 Invalidate,它在 WPF 中不存在)。这个答案显然是假设 WPF。
【解决方案3】:

要在设计器中显示图像,您需要覆盖绘制它的 OnPaint 方法。

DefaultValue 与 DefaultValueAttribute 相同。 .NET 中的所有属性都是继承自 System.Attribute 的类,所有这些类都类似于 Name*Attribute*,其中 Attribute 是固定的。那么“DefaultValue”就像一个别名。

【讨论】:

  • 我认为他想显示属性,而不是图像本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 2017-03-24
  • 2010-11-25
  • 1970-01-01
  • 2013-04-13
  • 2016-02-10
相关资源
最近更新 更多