0

I've done a fair bit of searching and experimentation but haven't gotten quite there yet. I'm trying to change a button's margin based on whether the scrollbar of a textbox is visible or not, but I can't find where that property is (apparently it's not on the textbox itself and the textbox doesn't have a ScrollViewer property). I'm REALLY trying to do this in pure XAML. Here's where I'm stuck:

<Window x:Class="deleteme.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:deleteme"
        mc:Ignorable="d"
        Title="MainWindow" Height="400" Width="400">
        <Grid>
            <TextBox x:Name="TheTextBox" Margin="10" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" FontSize="20">
                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur pretium et nisi lacinia varius. Quisque rutrum nibh at mauris vestibulum, vitae placerat dolor dignissim. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed eu risus eu turpis fermentum pharetra in ut orci. In vel leo luctus, ultrices massa at, sagittis lorem. Aliquam dictum quis sem eu commodo. Donec vestibulum ornare volutpat. Cras metus neque, vehicula sit amet sapien eget, viverra ornare diam. Proin orci tortor, cursus non hendrerit mattis, lobortis ornare risus. Nulla vehicula arcu id luctus hendrerit. Curabitur elit sapien, laoreet ut interdum eu, venenatis vel tellus. Aenean aliquet leo sed magna mollis, sit amet commodo lacus mattis. Etiam lectus arcu, ultrices in tincidunt nec, mattis eget felis. Morbi blandit tortor molestie lacus malesuada consequat nec sed urna.
            </TextBox>
            <Button Content="Button" HorizontalAlignment="Right" VerticalAlignment="Bottom" Padding="15">
                <Button.Style>
                    <Style TargetType="{x:Type Button}">
                        <Setter Property="Margin" Value="0,0,30,30"></Setter>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding ScrollViewer.ComputedVerticalScrollBarVisibility, ElementName=TheTextBox}" Value="Collapsed">
                                    <Setter Property="Margin" Value="0,0,47,30"/>
                                </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Button.Style>
            </Button>
        </Grid>
    </Window>

Form Image

TeejMonster
  • 105
  • 8
  • Look at the template for a textbox. See the scrollviewer? https://learn.microsoft.com/en-us/dotnet/desktop/wpf/controls/textbox-styles-and-templates?view=netframeworkdesktop-4.8 download snoop. Take a look at what controls make up your textbox. I would consider some code. Maybe an attached property or subclass and extend textbox. – Andy Feb 04 '21 at 18:48
  • I had looked at that but couldn't figure out how to "get to" the scrollviewer inside. – TeejMonster Feb 04 '21 at 19:07

1 Answers1

0

This isn't the prettiest, but I've definitely seen worse. Had to wrap the textbox in a scrollviewer and set the margin on visible AND collapsed.

<Window x:Class="deleteme.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:deleteme"
        mc:Ignorable="d"
        Title="MainWindow" Height="400" Width="400">
        <Grid>
        <ScrollViewer x:Name="TheScrollViewer" VerticalScrollBarVisibility="Auto" Margin="10">
                <TextBox x:Name="TheTextBox" TextWrapping="Wrap" FontSize="20">
                    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur pretium et nisi lacinia varius. Quisque rutrum nibh at mauris vestibulum, vitae placerat dolor dignissim. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed eu risus eu turpis fermentum pharetra in ut orci. In vel leo luctus, ultrices massa at, sagittis lorem. Aliquam dictum quis sem eu commodo. Donec vestibulum ornare volutpat. Cras metus neque, vehicula sit amet sapien eget, viverra ornare diam. Proin orci tortor, cursus non hendrerit mattis, lobortis ornare risus. Nulla vehicula arcu id luctus hendrerit. Curabitur elit sapien, laoreet ut interdum eu, venenatis vel tellus. Aenean aliquet leo sed magna mollis, sit amet commodo lacus mattis. Etiam lectus arcu, ultrices in tincidunt nec, mattis eget felis. Morbi blandit tortor molestie lacus malesuada consequat nec sed urna.
                </TextBox>
            </ScrollViewer>
            <Button Content="Button" HorizontalAlignment="Right" VerticalAlignment="Bottom" Padding="15">
                <Button.Style>
                    <Style TargetType="{x:Type Button}">
                        <Setter Property="Margin" Value="0,0,30,30"></Setter>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ComputedVerticalScrollBarVisibility, ElementName=TheScrollViewer}" Value="Visible">
                                <Setter Property="Margin" Value="0,0,47,30" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding ComputedVerticalScrollBarVisibility, ElementName=TheScrollViewer}" Value="Collapsed">
                                <Setter Property="Margin" Value="0,0,30,30" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Button.Style>
            </Button>
        </Grid>
    </Window>
TeejMonster
  • 105
  • 8