我想要一个 WPF 容器(面板、用户控件等),它公开一个属性以将所有子级设置为只读(如果已设置)。这应该很像将父控件设置为 IsEnabled=false,这也会禁用所有子控件。应考虑哪些子项及其哪些属性是固定的(例如 TextBox.ReadOnly、DataGrid.ReadOnly ...)。
我曾尝试创建这样一个控件,它基本上(递归地)迭代可视化树的所有子项并相应地处理控件。
除了进一步更改会影响可视化树的情况外,这工作正常,以便添加新的子项。这适用于 ContentControl 或 ItemsControl。如果在我遍历它们之后将子项添加到可视化树中,它们显然不是只读的。
我一直在努力寻找一个好的事件来使用react(基本上是在视觉树中检测新的 child ),但找不到合适的东西。 UpdateLayout 已触发,但每次都经常通过可视化树。
有办法解决吗?是否有另一种方法可以通过对父元素的绑定(bind)将所有(相关)子元素递归设置为只读?
(不:我不想将所有子项的只读属性绑定(bind)到全局绑定(bind)。关键是要有一个元素/部分将其传播给所有子项)
最佳答案
您可以使用提供 value inheritance 的附加属性来执行此操作:
public class ReadOnlyPanel
{
public static readonly DependencyProperty IsReadOnlyProperty =
DependencyProperty.RegisterAttached(
"IsReadOnly", typeof(bool), typeof(ReadOnlyPanel),
new FrameworkPropertyMetadata(false,
FrameworkPropertyMetadataOptions.Inherits, ReadOnlyPropertyChanged));
public static bool GetIsReadOnly(DependencyObject o)
{
return (bool)o.GetValue(IsReadOnlyProperty);
}
public static void SetIsReadOnly(DependencyObject o, bool value)
{
o.SetValue(IsReadOnlyProperty, value);
}
private static void ReadOnlyPropertyChanged(
DependencyObject o, DependencyPropertyChangedEventArgs e)
{
if (o is TextBox)
{
((TextBox)o).IsReadOnly = (bool)e.NewValue;
}
// other types here
}
}
您可以像这样在 XAML 中使用它:
<StackPanel local:ReadOnlyPanel.IsReadOnly="{Binding IsChecked, ElementName=cb}">
<CheckBox x:Name="cb" Content="ReadOnly"/>
<TextBox Text="Hello"/>
</StackPanel>
关于c# - WPF 容器将所有子控件变为只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20357191/
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我们有一个字符串:“”这个正则表达式://i如何从当前字符串中获取所有匹配项? 最佳答案 "".scan(//)参见scan在ruby-docs上 关于ruby-如何遍历Ruby中所有正则表达式匹配的字符串?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6857852/
是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述
我们如何捕获或/和处理ruby中所有未处理的异常?例如,这样做的动机可能是将某种异常记录到不同的文件或发送电子邮件给系统管理。在Java中我们会做Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandlerex);在Node.js中process.on('uncaughtException',function(error){/*code*/});在PHP中register_shutdown_function('errorHandler');functionerrorHandler(){$error=error_