我用虚拟属性创建了一个通用的无外观控件:
public abstract class TestControlBase<TValue> : Control
{
public static readonly DependencyProperty ValueProperty;
static TestControlBase()
{
ValueProperty = DependencyProperty.Register("Value", typeof(TValue),
typeof(TestControlBase<TValue>));
}
protected TestControlBase()
{
Focusable = false;
Value = default(TValue);
}
public virtual TValue Value
{
get
{
return (TValue)GetValue(ValueProperty);
}
set
{
SetValue(ValueProperty, value);
}
}
}
然后我创建了一个从它派生的控件并覆盖了Value属性:
public class TestControl : TestControlBase<int>
{
public override int Value
{
get
{
return base.Value;
}
set
{
base.Value = value;
}
}
}
所以我在Window XAML中使用它:
<TestControls:TestControl />
当我在设计师中打开窗口时,一切正常,但是当我将鼠标光标放到此行时,或者在设计器中对此控件我收到异常:
Exception has been thrown by the target of an invocation.
at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
Ambiguous match found.
at System.RuntimeType.GetPropertyImpl(String name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers)
at System.Type.GetProperty(String name)
at MS.Internal.ComponentModel.DependencyPropertyKind.get_IsDirect()
at MS.Internal.ComponentModel.DependencyPropertyKind.get_IsAttached()
at MS.Internal.ComponentModel.APCustomTypeDescriptor.GetProperties(Attribute[] attributes)
at MS.Internal.ComponentModel.APCustomTypeDescriptor.GetProperties()
at System.ComponentModel.TypeDescriptor.TypeDescriptionNode.DefaultExtendedTypeDescriptor.System.ComponentModel.ICustomTypeDescriptor.GetProperties()
at System.ComponentModel.TypeDescriptor.GetPropertiesImpl(Object component, Attribute[] attributes, Boolean noCustomTypeDesc, Boolean noAttributes)
at System.ComponentModel.TypeDescriptor.GetProperties(Object component)
at MS.Internal.Model.ModelPropertyCollectionImpl.GetProperties(String propertyNameHint)
at MS.Internal.Model.ModelPropertyCollectionImpl.<GetEnumerator>d__0.MoveNext()
at MS.Internal.Designer.PropertyEditing.Model.ModelPropertyMerger.<GetFirstProperties>d__0.MoveNext()
at MS.Internal.Designer.PropertyEditing.PropertyInspector.UpdateCategories(Selection selection)
at MS.Internal.Designer.PropertyEditing.PropertyInspector.OnSelectionChangedIdle()
谁知道这个问题?请解释:)我没有任何想法,除了WPF设计师不喜欢泛型。如果我用Object
替换泛型,则一切正常。
答案 0 :(得分:2)
伊万,
也许答案有点晚了,但其他人也可以使用它。 当我读到这是一个错误时,我遇到了同样的问题而且非常失望。但经过一些谷歌搜索后,我发现blog显示了一种使用这种继承的方法。似乎问题已解决,包括xaml中的一些属性。 我希望它有所帮助。
答案 1 :(得分:1)
我认为你无能为力。这只是一个错误。开发WF控件时也会发生同样的事情。
我正在开发Windows窗体控件的同事进行第二次控制,这不是通用的。这只是一种解决方法,但它确实有效。如果您想在设计师中工作,只需评论通用(&lt;&gt;),在完成工作后,取消注释。
我希望它会对你有所帮助:)。
答案 2 :(得分:1)
这已经很老了,但我(有点)偶然发现它...... 我不确定,但是你设置了一个不可为空的依赖属性而没有默认值 我认为无法确定未设置属性的值。 我想这里有一个问题。