开发者

Rescale listboxes or other items? but not text (WPF)

开发者 https://www.devze.com 2023-03-06 17:12 出处:网络
The开发者_StackOverflow question is quite clear. I have listviews or listboxes in my view. If i make my screen smaller, i want that my text (labels etc) stay the same size. But the listviews and listb

The开发者_StackOverflow question is quite clear. I have listviews or listboxes in my view. If i make my screen smaller, i want that my text (labels etc) stay the same size. But the listviews and listboxes have to become smaller, eventually with a scrollbar?

how do i do this?

Thanks


the ListBox has a ScrollViewer built in.

<ListBox ScrollViewer.VerticalScrollBarVisibility="Auto" />


The question is quite clear.

Well, not exactly. But I think this is what you're looking for. First, create a value converter that takes a Double and returns its reciprocal:

public class ReciprocalValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Double? d = value as Double?;
        return (d == null || d == 0)
                   ? null
                   : 1/d;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Now you can scale any content control, using a ScaleTransform, and use the ReciprocalValueConverter to keep any individual element contained within it to the original scale. So if the content control's scale is doubled, the content that you want to remain unchanged has its scale halved.

This example shows both scaling content controls and "unscaling" the items in a list box by assigning the LayoutTransform to each item:

<Window x:Class="ScaleTransformDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ScaleTransformDemo="clr-namespace:ScaleTransformDemo" Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ScaleTransformDemo:ReciprocalValueConverter x:Key="Reciprocal" />
    </Window.Resources>
    <DockPanel>
        <Slider x:Name="ScaleSlider"
                Orientation="Vertical"
                Minimum=".2"
                Maximum="4"
                Value="1" />
    <DockPanel>
        <DockPanel.LayoutTransform>
            <ScaleTransform ScaleX="{Binding ElementName=ScaleSlider, Path=Value}"
                            ScaleY="{Binding ElementName=ScaleSlider, Path=Value}" />
        </DockPanel.LayoutTransform>
        <Label DockPanel.Dock="Top">
            The content of this label scales with the slider.
        </Label>
        <Label DockPanel.Dock="Top">
            <Label.LayoutTransform>
                <ScaleTransform ScaleX="{Binding ElementName=ScaleSlider, Path=Value, Converter={StaticResource Reciprocal}}"
                                ScaleY="{Binding ElementName=ScaleSlider, Path=Value, Converter={StaticResource Reciprocal}}" />
            </Label.LayoutTransform>
            <Label.Content>
                This label's content stays the same size.
            </Label.Content>
        </Label>
        <Label DockPanel.Dock="Top">
            The ListBox below scales with the slider, too, but the ListBoxItems don't:
        </Label>
        <ListBox Height="50"
                 DockPanel.Dock="Top">
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="LayoutTransform">
                        <Setter.Value>
                            <ScaleTransform ScaleX="{Binding ElementName=ScaleSlider, Path=Value, Converter={StaticResource Reciprocal}}"
                                            ScaleY="{Binding ElementName=ScaleSlider, Path=Value, Converter={StaticResource Reciprocal}}" />
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>
            <ListBoxItem>Item 1</ListBoxItem>
            <ListBoxItem>Item 2</ListBoxItem>
            <ListBoxItem>Item 3</ListBoxItem>
            <ListBoxItem>Item 4</ListBoxItem>
            <ListBoxItem>Item 5</ListBoxItem>
            <ListBoxItem>Item 6</ListBoxItem>
        </ListBox>
        <TextBlock DockPanel.Dock="Top" />
    </DockPanel>
</DockPanel>
</Window>
0

精彩评论

暂无评论...
验证码 换一张
取 消