从Child禁用Parent的ScrollViewer

时间:2017-02-27 11:37:34

标签: wpf xaml

我有一个窗口,有一些控件。在这些控件中,我有一个内容控件,用于打开多个视图。此内容控件位于ScrollViewer下。如下面的代码:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow"
        Height="350"
        Width="525">
    <Grid>
        <ScrollViewer Grid.Row="2"
                      VerticalScrollBarVisibility="Disabled" 
                      HorizontalScrollBarVisibility="Auto">
            <ContentControl x:Name="ActiveItem" 
                            HorizontalContentAlignment="Stretch"
                            VerticalContentAlignment="Stretch"/>
        </ScrollViewer>
    </Grid>
</Window>

我们有不同的观点,我们过去通过将它们设置为ActiveItem来打开。在一个视图中,我想禁用父级的ScrollViewer。有什么办法吗? (更改只能在View的XAML中完成)。感谢

2 个答案:

答案 0 :(得分:0)

在XAML中?不.XAML是一种标记语言而已。

但您可以使用以下方法在可视化树中查找父ScrollViewer元素:

public static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
    var parent = VisualTreeHelper.GetParent(dependencyObject);

    if (parent == null) return null;

    var parentT = parent as T;
    return parentT ?? FindParent<T>(parent);
}

用法:

ActiveItem.Loaded += (s, e) => 
{
    ScrollViewer sv = FindParent<ScrollViewer>(ActiveItem);
    if (sv != null)
    {
        ...
    }
};

答案 1 :(得分:0)

您可以在视图模型中添加bool属性,以指示哪个视图需要滚动查看器并将其绑定到&#39; VerticalScrollBarVisibility&#39;使用某些转换器将bool转换为Disabled / Auto。

有点像:

<ScrollViewer Grid.Row="2"
                      VerticalScrollBarVisibility="{Binding IsScrollNeeded, Converter={StaticResource someConverter}}" 
                      HorizontalScrollBarVisibility="Auto">
            <ContentControl x:Name="ActiveItem" 
                            HorizontalContentAlignment="Stretch"
                            VerticalContentAlignment="Stretch"/>
        </ScrollViewer>