gpt4 book ai didi

wpf - 永久启用滚动条可能吗?

转载 作者:行者123 更新时间:2023-12-05 00:04:55 25 4
gpt4 key购买 nike

我在想办法保留 ScrollBars/ScrollViewers 时遇到问题永久启用。我正在开发一个数据输入应用程序,其中某些用户可能只有“读取”权限。这需要禁用所有控件,以便他们无法进行任何更改。

当控件被禁用时,用户无法查看可滚动控件中的所有信息(Infragistics XamDataGrid、DevExpress GridControlTextBox es with Wrap、ListBox 等)。我希望我能“智胜”微软,并实现 Trigger设置 IsEnabled当它设置为 false 时为 true,但当然,它不起作用(出于各种原因,我敢肯定)。

我现在一直专注于文本框,试图禁用内容,但保留 ScrollViewer启用并且没有运气。

我希望可能有一个解决方案,即覆盖 IsEnabled ScrollViewer 的依赖属性总是返回真,或提供某种 Style这不允许 ScrollViewer成为残疾人。

我知道一个 TextBox有一个 IsReadOnly属性,但这对我需要解决此问题的许多其他控件没有用。

有什么办法可以以一种相当简单的方式解决这个问题(很简单,因为我可以制作一种适用于任何地方的样式,而无需更改 200 多个代码文件)。

谢谢

编辑:这是我在示例项目中使用的代码来尝试解决此问题。

<Window x:Class="WPFScrollViewerStyles.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style BasedOn="{x:Null}" TargetType="{x:Type TextBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true">
<ScrollViewer x:Name="PART_ContentHost" HorizontalScrollBarVisibility="Visible"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" IsEnabled="True" />
</Microsoft_Windows_Themes:ListBoxChrome>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="IsEnabled" Value="True" TargetName="PART_ContentHost" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid IsEnabled="False">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="100" />
<RowDefinition Height="100" />
<RowDefinition Height="100" />
</Grid.RowDefinitions>

<TextBox x:Name="txtScroller" Width="100" Height="100" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" TextWrapping="Wrap" ScrollViewer.CanContentScroll="True">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras faucibus hendrerit lorem, auctor vehicula sem molestie nec. Quisque non massa quam. Nullam tempor blandit tempor. Integer in molestie ipsum. Donec augue mi, auctor vitae scelerisque a, vehicula ac ipsum. Etiam posuere vulputate augue quis convallis. Nullam aliquet purus nec lacus fermentum hendrerit egestas purus tincidunt. Suspendisse quis lacinia libero. Quisque facilisis turpis at augue dignissim aliquam ultrices sem porta. Etiam sagittis arcu id nibh ultrices dictum. Nulla non lectus luctus est malesuada luctus. Praesent sed lobortis nisi. Morbi et porttitor massa. Sed pellentesque, nisl eu imperdiet varius, ligula augue cursus nisl, eu egestas metus velit non elit. Phasellus elementum hendrerit risus, eu tincidunt ante gravida vel.
</TextBox>

<ListBox x:Name="lstScroller" Width="100" Height="100" Grid.Column="1">
<ListBox.Items>
<ListBoxItem Content="Item 1" />
<ListBoxItem Content="Item 2" />
<ListBoxItem Content="Item 3" />
<ListBoxItem Content="Item 4" />
<ListBoxItem Content="Item 5" />
<ListBoxItem Content="Item 6" />
<ListBoxItem Content="Item 7" />
<ListBoxItem Content="Item 8" />
<ListBoxItem Content="Item 9" />
<ListBoxItem Content="Item 10" />
<ListBoxItem Content="Item 11" />
<ListBoxItem Content="Item 12" />
<ListBoxItem Content="Item 13" />
<ListBoxItem Content="Item 14" />
<ListBoxItem Content="Item 15" />
</ListBox.Items>
</ListBox>
</Grid>

最佳答案

感谢 Microsoft 的 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 的说法,这可能会产生无法预料的后果,但截至目前(以及我所有强大的测试应用程序,它都带有禁用的网格和两个可滚动控件),我还没有找到。希望这个解决方案可以帮助其他人,没有问题。

关于wpf - 永久启用滚动条可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5149207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com