小编Mat*_*_E_的帖子

为什么我可以访问未在DependencyObject上注册的DependencyProperties?

我希望有人可以解释我在继续探索DependencyObjects和DependencyProperties时遇到的一些意想不到的行为.

给出以下简单类:

    class SomeClass : DependencyObject {
    }
Run Code Online (Sandbox Code Playgroud)

我可以愉快地编写如下代码:

public static void Test() {
  SomeClass a = new SomeClass();
  Console.WriteLine(a.GetValue(EllipseGeometry.RadiusXProperty));
  a.SetValue(EllipseGeometry.RadiusXProperty, 3.24 );
  Console.WriteLine(a.GetValue(EllipseGeometry.RadiusXProperty));
}
Run Code Online (Sandbox Code Playgroud)

它给出了以下输出:

0
3.24
Run Code Online (Sandbox Code Playgroud)

我的类中没有任何与EllipseGeometry类有任何关系的东西,我没有将我的类添加为EllipseGeometry.RadiusXProperty属性的所有者或者使用了RegisterAttached(),为什么这样做呢?在没有框架引发错误的情况下,我似乎可以很高兴地将任何DP添加到我的DO.

有没有人发现这种奇怪的行为?我本来期望某种形式的例外,因为"你还没有用这个对象注册这个属性"......我很感激任何指导是否有任何特殊用途以这种方式向DO添加DP,因为我看不到允许这种行为的目的.

非常感谢,马特

c# wpf dependency-properties dependencyobject

8
推荐指数
1
解决办法
115
查看次数

它的ownerType不是DependencyObject的DependencyProperty有什么用?

我刚刚开始在WPF中使用DependencyProperties,我想在我掌握它们时检查一些想法.

鉴于以下内容(并暂时忽略命名约定):

class MyTestClass
{
    public static readonly DependencyProperty dp1 = DependencyProperty.Register("MyProp", typeof(String), typeof(MyTestClass));

    public static readonly DependencyProperty dp2 = DependencyProperty.Register("MyProp2", typeof(String), typeof(MyTestClass), new PropertyMetadata("Hello"));
}
Run Code Online (Sandbox Code Playgroud)

我发现dp2抛出一个TypeInitializationException,消息"'MyTestClass'类型必须从DependencyObject派生",这是我所期望的,但dp1很高兴被接受.

现在,我理解为什么dp2引发异常,因为我试图在不是DependencyObject的类型上注册属性元数据,这很好.我已经看了下,并且可以看到dp1和dp2都遵循的代码路径,所以我从代码的角度理解为什么dp1不会引发异常,但从概念上讲我会期望dp1和dp2引发相同的异常.

我的问题是在创建像owner不是DependencyObject的dp1这样的DependencyProperty时会有什么用处,因为我看不到如何在没有DependencyObject的GetValue/SetValue方法的情况下使用它.

c# wpf dependency-properties dependencyobject

7
推荐指数
1
解决办法
1806
查看次数

C++静态const和初始化(有惨败)

我很久没有回到C++了,而且我对这个众所周知的静态初始化问题的理解有点磕磕绊绊.

假设我有一个简单的类Vector2,如下所示(请注意,我知道x和y应该是getter和setter的私有,为简洁起见,这些只是省略了):

class Vector2 {

public:
  Vector2(float x, float y) :x(x), y(y) {};
  float x,y;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我想指定一个静态const成员来表示一个x和y设置为1的Vector2,我不确定如何继续 - 静态const成员会违反静态初始化问题,还是会使它们成为const的行为他们还好吗?我正在玩弄以下可能性:

可能性1:

// .h
class Vector2 {

public:
  Vector2(float x, float y) :x(x), y(y) {}
  static const Vector2 ONE;
  float x,y;
};

// .cpp
const Vector2 Vector2::ONE = Vector2(1.f, 1.f);
Run Code Online (Sandbox Code Playgroud)

可能性2:

// .h
class Vector2 {

public:
  Vector2(float x, float y) :x(x), y(y) {}
  static const Vector2& getOne();
  float x,y;
private: 
  static const Vector2 ONE;
};

// .cpp
const Vector2 Vector2::ONE = …
Run Code Online (Sandbox Code Playgroud)

c++ static initialization const

6
推荐指数
1
解决办法
6465
查看次数

为什么我可以通过模板类扩展私有嵌套类?

我遇到了一些奇怪的事情,似乎模板类可以扩展私有嵌套类.

给定以下私有嵌套类:

class A {
private:
  class B {
  protected:
    void doSomething() {
      ...
    }
  };
};
Run Code Online (Sandbox Code Playgroud)

以下内容未按预期编译:

class C : public A::B {
public:
  C() {
    this->doSomething();
  }
};
Run Code Online (Sandbox Code Playgroud)

然而,gcc似乎很乐意接受以下编译,没有呜咽,实际上调用方法:

template<typename T>
class C : public A::B {
public:
  C() {
    this->doSomething();
  }
};
Run Code Online (Sandbox Code Playgroud)

有没有人知道这是否是使用模板时的预期行为,或者我在gcc中发现了一个奇怪的现象.我在版本4.4.5(Ubuntu/Linaro 4.4.4-14ubuntu5)所以我意识到我有点过时了.如果这是预期的行为,我会非常感谢解释(或指向解释的指针),因为它不是我所期待的,我想知道更多关于它的信息.

非常感谢,马特

c++ inheritance templates nested

5
推荐指数
1
解决办法
322
查看次数