是否有任何文章描述DependencyObject
WPF中的类如何"引擎盖下"?
具体来说,我很好奇如何有效地存储和访问依赖属性.
如何将属性名称(在字符串中)转换为DependencyProperty
?
我有一组属性名称,其值以字符串和a表示DependencyObject
.现在我想将这些属性值设置为DependencyObject
.有关如何实现这一点的任何想法?
谢谢.
我在网上看到了两种不同的方法来增强IValueConverter.其中一个从MarkupExtension扩展了ValueConverter,另一个从DependencyObject扩展.我无法从两者延伸,所以我想知道是否有一个比另一个好?
我收到这个错误:
不能使用属于与其父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)
我还在跟踪它; 如果该系列行被注释掉,崩溃仍然发生,并且线程状态具有"刚刚结束"的线程(因此垃圾收集假设).
我有一个名为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将被调用.
我竭力要找到所使用的财产继承树(或传承语境)足够的信息DependencyObject
和DependencyProperty
.
我想使用DependencyProperty
典型WPF页面之外的值继承功能,这样对象A就是逻辑父对象B,因此分配给对象A上的属性的值将自动传播到对象B,除非它已在本地set(有点像FlowDirection
WPF中的属性).
如果对象A和对象B是从DependencyObject
,并且不是a的子节点UIElement
(换句话说,对象A是它自己的根),那么如何建立逻辑树以便DependencyProperty
理解B是A的子节点?
该 Hillberg可冻结计谋以及技巧的约什-史密斯的袋子不完全是我要找的.我不希望从现有的元素树检索属性...我要创造我自己的,非可视元素树...即有超过的传承上下文控制.
有谁知道这个知识藏在哪里?
我希望有人可以解释我在继续探索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,因为我看不到允许这种行为的目的.
非常感谢,马特
有人知道是否可以在基于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属性包含一个实际的非空集合,所以这不是问题.
两者都没有关于输出日志中的绑定的错误消息.
有线索吗?
我刚刚开始在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方法的情况下使用它.
我有一组绑定到数据的控件,我想在程序上为绑定添加验证器.目前,我能够遍历可视树以找到带有绑定的控件,并将我的验证器添加到这些控件中.但是为了进一步指定哪些控件应该具有特定的验证,我想使用样式.所以我的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阅读器中丢失了这些信息?
dependencyobject ×10
wpf ×10
c# ×5
.net ×1
data-binding ×1
freezable ×1
notify ×1
styles ×1
xaml ×1