防止只读文本框在Silverlight中变灰

在Silverlight中,如何使用IsReadOnly="True"创建TextBox不会变灰。 我的应用程序的灰色效果看起来很糟糕,我想禁用它,或改变它的外观/颜色。

Silverlight 2中有几个选项,最简单的是使用TextBlock,因为它只是readonly。

如果你需要一个TextBox,那么你需要做的是给它一个不同于灰色效果的不同风格。

要做到这一点,打开混合。 右键单击TextBox并选择编辑控件(模板) – >编辑副本…根据需要调用新样式。

然后,您需要编辑此新样式并删除名为“ReadOnlyVisualElement”的边框,并删除改变该边框的不透明度属性的故事板。

希望这可以帮助。

添加了样式XAML

   

我会得到Blend的预览,手工编写上面的代码将是大量不必要的工作。

似乎没有任何东西在xaml中工作(像往常一样),所以我想出的最好的解决方案就是在没有IsReadOnly属性的情况下自己创建一个文本框。

 public class ReadOnlyTextBox : TextBox { protected override void OnKeyDown(KeyEventArgs e) { e.Handled = true; base.OnKeyDown(e); } } 

如果您只想要HTML中的等效文本块,可以选择(由于某些原因,即使缺少Silverlight 4),您也可以稍微缩短Graeme的答案:

  

您甚至可以删除已禁用的状态。

这是@Struan的答案的增强版本。

我假设你想要允许Select allCopy如果你想要一个只读文本框。 您需要处理按键,例如Ctrl+ACtrl+C

免责声明:这不是一套完整的密钥 – 您可能需要添加更多密钥,但这至少可以进行复制。

 public class ReadOnlyTextBox : TextBox { protected override void OnKeyDown(KeyEventArgs e) { if (e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Up || e.Key == Key.Down) { base.OnKeyDown(e); return; } if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control || (Keyboard.Modifiers & ModifierKeys.Apple) == ModifierKeys.Apple) { if (e.Key == Key.A || e.Key == Key.C) { // allow select all and copy! base.OnKeyDown(e); return; } } e.Handled = true; base.OnKeyDown(e); } } 

这是我正在使用的一个简单样式,它向用户表明该项目是可选的,但比典型的文本框小。

  

我发现@ Simon_Weaver的解决方案最容易实现。 我做的唯一改变是检查Key.Tab以及左/右/上/下,以便我可以跳出该字段。 我创建了类ReadOnlyTextBox并复制了上面的代码。 然后我添加了Key.Tab的检查并编译。 接下来我改变了我的Xaml标签

  

  

(删除IsEnabled引用并添加背景颜色)。 它的外观和工作完全符合我的预期。

谢谢西蒙。

我想减少裸露的样式,并使用silverlight 4.0进行测试:

  

这几乎是一个骗子,就像说: Hey silverligh, this textbox is a textblock! 您最终应该在TextBlock标记中添加一些内容,以更好地反映其他TextBox属性。

在按钮的定义/行为/外观发生变化之前,另一个更优雅的解决方案是简单地将TextBox更改为Button。 将“文本”属性更改为“内容”属性以设置显示的文本,删除“IsReadOnly”设置,您将获得所需的效果,我相信(一个类似文本框的平面控件,支持文本和所有边框,背景,没有不透明度变化的TextBox的前景属性[变灰]和定义新样式的麻烦)。

当用户尝试与此控件进行交互时,它的function会在click事件上发生更改,但如果没有与该按钮关联的事件处理程序,则不会对您的界面产生任何影响。 事实上,我认为默认按钮行为使效果看起来有点“酷”。