标签: dependencyobject

WPF的DependencyObject是如何实现的?

是否有任何文章描述DependencyObjectWPF中的类如何"引擎盖下"?

具体来说,我很好奇如何有效地存储和访问依赖属性.

c# wpf dependency-properties dependencyobject

13
推荐指数
1
解决办法
2万
查看次数

来自字符串的DependencyProperty

如何将属性名称(在字符串中)转换为DependencyProperty

我有一组属性名称,其值以字符串和a表示DependencyObject.现在我想将这些属性值设置为DependencyObject.有关如何实现这一点的任何想法?

谢谢.

c# wpf xaml dependency-properties dependencyobject

13
推荐指数
1
解决办法
6558
查看次数

改进了IValueConverter - MarkupExtension还是DependencyObject?

我在网上看到了两种不同的方法来增强IValueConverter.其中一个从MarkupExtension扩展了ValueConverter,另一个从DependencyObject扩展.我无法从两者延伸,所以我想知道是否有一个比另一个好?

c# wpf markup-extensions dependencyobject ivalueconverter

13
推荐指数
2
解决办法
9374
查看次数

什么是父母可冻结?这个错误是什么意思?

我收到这个错误:

不能使用属于与其父Freezable不同的线程的DependencyObject

那有什么意思?是英文的吗?父母被冻结了,还是只是可以冻结?任何使父母不可冻结的方法,如果它让错误消失了?

发生了什么:

我在WPF应用程序中有两个opengl winforms控件,到目前为止,一切都在顺利进行(我认为).现在,我添加了一个更新,以便当一个winform控件更新图像时,另一个也应该.这实际上曾经工作过,现在我收到了这个错误.逐步执行代码会导致崩溃发生在随机位置,这使我相信它是一个垃圾收集错误(即,另一个线程中的某些更新正在创建收集垃圾的东西,并且该收集在随机时间发生).

异常是在主run方法中捕获的,它是一个InvalidOperationException.

我在这里抓住稻草.我从哪里开始?

编辑:看起来引起问题的电话是这样的:

        if (imagePanel.InvokeRequired)
        {
            imagePanel.Invoke(new System.Windows.Forms.MethodInvoker(delegate{
                imagePanel.ClearImages();
            }));
        }
        else
        {
            imagePanel.ClearImages();
        }
Run Code Online (Sandbox Code Playgroud)

我还在跟踪它; 如果该系列行被注释掉,崩溃仍然发生,并且线程状态具有"刚刚结束"的线程(因此垃圾收集假设).

wpf invalidoperationexception dependencyobject freezable

11
推荐指数
1
解决办法
5457
查看次数

WPF自定义DependencyProperty通知更改

我有一个名为MyComponent的类,它有一个DependencyProperty caled BackgroundProperty.

public class MyComponent
{
    public MyBackground Background
    {
        get { return (MyBackground)GetValue(BackgroundProperty); }
        set { SetValue(BackgroundProperty, value); }
    }
    public static readonly DependencyProperty BackgroundProperty =
        DependencyProperty.Register("Background", typeof(MyBackground),
            typeof(MyComponent), new FrameworkPropertyMetadata(default(MyBackground), new PropertyChangedCallback(OnPropertyChanged)));
}
Run Code Online (Sandbox Code Playgroud)

MyBackground是一个派生自DependencyObject的类,它有一些DependencyProperties.

public class MyBackground : DependencyObject
{
    public Color BaseColor
    {
        set { SetValue(BaseColorProperty, value); }
        get { return (Color)GetValue(BaseColorProperty); }
    }
    public static readonly DependencyProperty BaseColorProperty =
        DependencyProperty.Register("BaseColor", typeof(Color),
            typeof(MyBackground ), new UIPropertyMetadata(Colors.White));

    [...]
}
Run Code Online (Sandbox Code Playgroud)

现在,我想要的是当MyBackground中的属性发生更改时,MyComponent将被通知MyBackground已更改,并且名为OnPropertyChanged的PropertyChangedCallback将被调用.

wpf dependency-properties notify dependencyobject

9
推荐指数
1
解决办法
8892
查看次数

自定义DependencyObject继承树

我竭力要找到所使用的财产继承树(或传承语境)足够的信息DependencyObjectDependencyProperty.

我想使用DependencyProperty典型WPF页面之外的值继承功能,这样对象A就是逻辑父对象B,因此分配给对象A上的属性的值将自动传播到对象B,除非它已在本地set(有点像FlowDirectionWPF中的属性).

如果对象A和对象B是从DependencyObject,并且不是a的子节点UIElement (换句话说,对象A是它自己的),那么如何建立逻辑树以便DependencyProperty理解B是A的子节点?

Hillberg可冻结计谋以及技巧的约什-史密斯的袋子不完全是我要找的.我希望从现有的元素树检索属性...我要创造我自己的,非可视元素树...即有超过的传承上下文控制.

有谁知道这个知识藏在哪里?

.net wpf dependency-properties dependencyobject

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

为什么我可以访问未在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
查看次数

在IValueConverter上进行数据绑定

有人知道是否可以在基于IValueConverter的类上进行数据绑定?

我有以下转换器:

[ValueConversion(typeof(int), typeof(Article))]
public class LookupArticleConverter : FrameworkElement, IValueConverter {
    public static readonly DependencyProperty ArticlesProperty = DependencyProperty.Register("Articles", typeof(IEnumerable<Article>), typeof(LookupArticleConverter)); 

    public IEnumerable<Article> Articles
    {
        get { return (IEnumerable<Article>)GetValue(ArticlesProperty); }
        set { SetValue(ArticlesProperty, value); }
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        ...
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

它的目的是通过Id查找列表中的文章,并返回该文章.

但是,我想通过将一个集合数据绑定到它来填充Articles属性,如下所示:

<local:LookupArticleConverter Articles="{Binding Articles}" x:Key="LookupArticle"/>
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.永远不会调用setter方法.source属性包含一个实际的非空集合,所以这不是问题.

两者都没有关于输出日志中的绑定的错误消息.

有线索吗?

data-binding wpf dependencyobject ivalueconverter

7
推荐指数
2
解决办法
5206
查看次数

它的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
查看次数

给定一个样式化的WPF DependencyObject,如何在代码中获取样式键?

我有一组绑定到数据的控件,我想在程序上为绑定添加验证器.目前,我能够遍历可视树以找到带有绑定的控件,并将我的验证器添加到这些控件中.但是为了进一步指定哪些控件应该具有特定的验证,我想使用样式.所以我的XAML看起来像这样:

<TextBox Name="someTextBox" Style="{StaticResource optionalNumericTextBox}" />
Run Code Online (Sandbox Code Playgroud)

这里,optionalNumericTextBox样式既可以添加验证错误模板,也可以作为装饰器来指示此文本框应该应用可选的数字验证器.

当我遍历可视树,发现带有绑定的控件,然后需要确定使用的样式时,会出现问题.目前我已经尝试过了

dependencyObject.GetValue(FrameworkElement.StyleProperty)
Run Code Online (Sandbox Code Playgroud)

这给了我一个Style对象,但据我所知,这个对象没有携带'optionalNumericTextBox'值.甚至可以确定密钥,还是XAML阅读器中丢失了这些信息?

wpf styles dependencyobject

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