C# 如何根据窗口大小有选择地启用和禁用滚动按钮

C# 如何根据窗口大小有选择地启用和禁用滚动按钮,c#,wpf,scrollviewer,C#,Wpf,Scrollviewer,我正在尝试制作一个滚动查看器,其中滚动按钮只有在窗口太小而无法显示所有内容时才可见。我在scrollviewer中的stackpanel中添加了一些按钮。 滚动正在工作,但当堆栈中没有足够的元素,因此不需要滚动时,如何禁用它?您可以创建如下转换器 public class MyConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, Cu

我正在尝试制作一个滚动查看器,其中滚动按钮只有在窗口太小而无法显示所有内容时才可见。我在scrollviewer中的stackpanel中添加了一些按钮。



滚动正在工作,但当堆栈中没有足够的元素,因此不需要滚动时,如何禁用它?

您可以创建如下转换器

public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is double)
        {
            return ((double)value < 140) ? Visibility.Visible : Visibility.Collapsed;
        }
        return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
公共类MyConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
如果(值为双精度)
{
返回((双精度)值<140)?可见性。可见:可见性。折叠;
}
返回可见性。折叠;
}
公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
其中140是所需的总高度(可以将此参数设置为动态)。然后您只需要绑定按钮的可见性

<RepeatButton x:Name="LineRightButton" 
                Visibility="{Binding ActualHeight, Converter={StaticResource MyConv}, ElementName=scrollViewer, Mode=OneWay}"
                Grid.Column="0"
                Grid.Row="2"
                Background="{StaticResource downarrow}" 
                Command="{x:Static ScrollBar.LineUpCommand}"      
                CommandTarget="{Binding ElementName=scrollViewer}"/>

您只需要在参考资料中定义上面提到的转换器,就完成了

编辑具有多重绑定的解决方案2:

如果要避免硬编码按钮的总高度,可以使用多值转换器和多绑定

public class MyConverter : IMultiValueConverter
{
    public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value[0] is double && value[1] is double)
        {
            return ((double)value[0] < (double)value[1]) ? Visibility.Visible : Visibility.Collapsed;
        }
        return Visibility.Collapsed;
    }


    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
公共类MyConverter:IMultiValueConverter
{
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
{
如果(值[0]是双精度的&值[1]是双精度的)
{
返回((双精度)值[0]<(双精度)值[1])?可见性。可见:可见性。折叠;
}
返回可见性。折叠;
}
公共对象[]转换回(对象值,类型[]目标类型,对象参数,CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}
并以这种方式修改您的按钮

<RepeatButton x:Name="LineRightButton" 
            Grid.Column="0"
            Grid.Row="2"
          Background="Black" 
            Command="{x:Static ScrollBar.LineUpCommand}"      
            CommandTarget="{Binding ElementName=scrollViewer}">
        <RepeatButton.Visibility>
            <MultiBinding Converter="{StaticResource MyConv}">
                <Binding Path="ActualHeight"  ElementName="scrollViewer"/>
                <Binding Path="ActualHeight"  ElementName="test"/>
            </MultiBinding>
        </RepeatButton.Visibility>
    </RepeatButton>


在哪里“test是包含按钮的stackpanel的名称

我不想要滚动条。我只需要滚动按钮在需要时可见抱歉我误解了这一点好的,你有什么建议我可以根据需要在代码中隐藏重复按钮请检查我的回答是的。我这么做只是为了让你了解我的解决方案。您还必须对另一个按钮应用相同的代码。在给出按钮的位置时,该按钮出现了问题,现在正在工作。您对当鼠标位于“重复”按钮上时如何获得滚动功能有何建议。@jithin您可能需要一个事件触发器。不过,既然这是另一个问题,而且这个问题已经解决了,我建议你在SOi上再问一个问题。我这么做了。请调查一下。网址是
<RepeatButton x:Name="LineRightButton" 
            Grid.Column="0"
            Grid.Row="2"
          Background="Black" 
            Command="{x:Static ScrollBar.LineUpCommand}"      
            CommandTarget="{Binding ElementName=scrollViewer}">
        <RepeatButton.Visibility>
            <MultiBinding Converter="{StaticResource MyConv}">
                <Binding Path="ActualHeight"  ElementName="scrollViewer"/>
                <Binding Path="ActualHeight"  ElementName="test"/>
            </MultiBinding>
        </RepeatButton.Visibility>
    </RepeatButton>