gpt4 book ai didi

wpf - 如何将 DataTrigger 绑定(bind)到单独的 ListBox ScrollViewer 的 ComputedVerticalScrollBarVisibility 属性?

转载 作者:行者123 更新时间:2023-12-04 05:21:40 26 4
gpt4 key购买 nike

如果列表框的垂直滚动条折叠,我想调整放置在单独列表框上方的边框或边距的宽度或可见性。

我正在尝试这样的事情,但无法弄清楚如何到达 ListBox ScrollViewer。显然,DataTrigger 中的 Path 不正确。

<Border Width={Binding Source={x:Static SystemParameters.ScrollWidth}}">
<Border.Style>
<Style>
<Setter Property="Border.Visibility" Value="Visible"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=listBox,
Path=***ScrollViewer.ComputedVerticalScrollBarVisibility***}"
Value="Collapsed">
<Setter Property="Border.Visibility" Value="Collapsed"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>

<ListBox Name="listBox" ItemsSource="{Binding MyItems}"/>

有没有办法获得那个 ListBox 属性?如果没有,有没有更好的方法来解决这个问题?

非常感谢!

最佳答案

将 ListBox 包装在另一个 ScrollViewer 中的解决方法允许以冗余 ScrollViewer 控件为代价的全 XAML 解决方案(请参阅问题中的评论)。最后,我的队友决定采用如下代码隐藏解决方案。

这是具有我们需要访问的 ScrollViewer 的 ListBox 的相关属性。

<ListBox Name="_listBox" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
Loaded="InitializeListBoxScrollViewerProperty"/>

这是公开滚动查看器以供外部控件使用的代码隐藏。
private static readonly DependencyPropertyKey ListBoxScrollViewerPropertyKey =
DependencyProperty.RegisterReadOnly("ListBoxScrollViewer", typeof(ScrollViewer),
typeof(MyEditView), new PropertyMetadata());

protected static readonly DependencyProperty ListBoxScrollViewerProperty =
ListBoxScrollViewerPropertyKey.DependencyProperty;

protected ScrollViewer ListBoxScrollViewer
{
get { return (ScrollViewer)GetValue(ListBoxScrollViewerProperty); }
private set { SetValue(ListBoxScrollViewerPropertyKey, value); }
}

private void InitializeListBoxScrollViewerProperty(object sender, RoutedEventArgs args)
{
if (ReferenceEquals(args.OriginalSource, _listBox))
{
var scrollViewer = _listBox.GetFirstDescendantBreadthFirst<ScrollViewer>();
if (scrollViewer != null)
{
ListBoxScrollViewer = scrollViewer;
}
}
}

以下是使用的扩展方法:
public static class DependencyObjectExtensions
{
public static TDescendant GetFirstDescendantBreadthFirst<TDescendant>
(this DependencyObject dependencyObject) where TDescendant : DependencyObject
{
if (dependencyObject == null) { throw new ArgumentNullException(); }
return GetFirstDescendantBreadthFirst<TDescendant>(GetAllChildren(dependencyObject));
}

private static TDescendant GetFirstDescendantBreadthFirst<TDescendant>
(IEnumerable<DependencyObject> descendants) where TDescendant : DependencyObject
{
if (!descendants.Any()) return null;
var descendant = descendants.OfType<TDescendant>().FirstOrDefault();
if (descendant != null) return descendant;
return GetFirstDescendantBreadthFirst<TDescendant>(descendants.SelectMany(GetAllChildren));
}

private static IEnumerable<DependencyObject> GetAllChildren(DependencyObject dependencyObject)
{
return Enumerable
.Range(0, VisualTreeHelper.GetChildrenCount(dependencyObject))
.Select(i => VisualTreeHelper.GetChild(dependencyObject, i));
}
}

最后,可以在 XAML 的另一部分访问滚动查看器。
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding ListBoxScrollViewer.ComputedVerticalScrollBarVisibility,
RelativeSource={RelativeSource AncestorType=l:MyEditView}}" Value="Visible">
<Setter Property="Margin" Value="{StaticResource myWidenedMargin}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>

关于wpf - 如何将 DataTrigger 绑定(bind)到单独的 ListBox ScrollViewer 的 ComputedVerticalScrollBarVisibility 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13629650/

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