我在设法保持ScrollBars/ScrollViewers
永久启用时遇到问题。我正在开发一个数据输入应用程序,其中某些用户可能只具有“读取”权限。这需要禁用所有控件,以便它们无法进行任何更改。
当控件被禁用时,用户无法查看可滚动控件中的所有信息(Infragistics XamDataGrid
,DevExpress GridControl
,TextBox
es with Wrap,ListBox
等。我希望我能“智取”微软,并设置Trigger
将IsEnabled
设置为true,当它被设置为false时,但当然,它不起作用(由于各种原因,我确定。)
我现在一直专注于文本框,试图禁用内容,但保持ScrollViewer
启用并没有运气。
我希望可能有一个解决方案,I.E。覆盖IsEnabled
的{{1}}依赖项属性以始终返回true,或者提供某种不允许ScrollViewer
被禁用的Style
。
我知道ScrollViewer
具有TextBox
属性,但这对我解决此问题所需的许多其他控件没有用。
我有什么方法可以用一种相当简单的方式来解决这个问题(简单的方法就是我可以制作一个适用于所有地方的风格,而无需更改200多个代码文件)。
由于
编辑:以下是我在示例项目中使用的代码,试图解决此问题。
IsReadOnly
答案 0 :(得分:5)
感谢Cedric Dussud在微软,我找到了一个解决方案。
供参考:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/3bf5e186-845c-4b63-acd9-17d294a30f77
我不是子类化ScrollViewer控件,而是覆盖应用程序的Application_Startup事件中的元数据,如下所示:
ScrollViewer.IsEnabledProperty.OverrideMetadata(typeof(ScrollViewer), new UIPropertyMetadata(true, new PropertyChangedCallback(ScrollViewer_IsEnabledPropertyChanged), new CoerceValueCallback(ScrollViewerForceEnabled)));
然后我处理CoerceValueCallback总是返回true,如下所示:
private static void ScrollViewer_IsEnabledPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs args) { }
private static object ScrollViewerForceEnabled(DependencyObject source, object value)
{
return true;
}
根据Cedric的说法,这可能会产生无法预料的后果,但截至目前(以及我所有强大的测试应用程序都有一个禁用的网格和两个可滚动的控件)我还没找到。希望这个解决方案能够帮助其他人解决问题。
答案 1 :(得分:2)
我知道这是一个老问题,但我认为我找到了一个类似但更简单的解决方案,可以帮助其他人:而不是覆盖ScrollViewer的IsEnabledProperty的属性元数据,我采用了相同的方法,但是应用于ScrollBar的IsEnabledProperty 。这似乎没问题,并且不需要我创建新模板并将其应用于滚动查看器。唯一的缺点似乎是鼠标滚轮和向上/向下翻页键盘命令不起作用(因为滚动查看器本身仍然被禁用)。 覆盖元数据代码为:
ScrollBar.IsEnabledProperty.OverrideMetadata(
typeof(ScrollBar),
new FrameworkPropertyMetadata(
(PropertyChangedCallback) null,
(CoerceValueCallback) AlwaysCoerceToTrue));
和'AlwaysCoerceToTrue'方法是:
private static object AlwaysCoerceToTrue(DependencyObject o, object value)
{
return true;
}
答案 2 :(得分:0)
我认为您可以重新设置UI元素,使它们使用包含
的控件模板<ScrollViewer HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible" ... />
例如,对于TextBox
,您可以使用修改后的default control template:
<ControlTemplate TargetType="{x:Type TextBoxBase}">
<Border Name="Border" CornerRadius="2" Padding="2" BorderThickness="1">
...
<ScrollViewer Margin="0" x:Name="PART_ContentHost"
HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible"/> <!-- HERE -->
</Border>
</ControlTemplate>