C# 如何将矩形的边距绑定到上/下和左/右的两个滑块

C# 如何将矩形的边距绑定到上/下和左/右的两个滑块,c#,wpf,margin,C#,Wpf,Margin,我正在尝试制作一个wpf程序,其中包含一个矩形,顶部有两个滑块: 第一个滑块更改矩形的左/右边距,右滑块更改上/下边距,因此看起来矩形越来越大越来越小。但是,如果更改窗口大小,矩形将进行调整 这是我的密码: <Window x:Class="Rechteck.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schema

我正在尝试制作一个wpf程序,其中包含一个矩形,顶部有两个滑块:

第一个滑块更改矩形的左/右边距,右滑块更改上/下边距,因此看起来矩形越来越大越来越小。但是,如果更改窗口大小,矩形将进行调整

这是我的密码:

<Window x:Class="Rechteck.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        >
    <Grid>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="50*"/>
                <ColumnDefinition Width="50*"/>
            </Grid.ColumnDefinitions>

            <TextBlock Grid.Column="0" HorizontalAlignment="Center">Rand top/bottom</TextBlock>
            <Slider Grid.Column="0"
              x:Name="MySlider" 
              VerticalAlignment="Top" 
              Minimum="10" 
              Maximum="300" 
              Value="150" 
              Margin="10" />

            <TextBlock Grid.Column="1" HorizontalAlignment="Center">Rand left/right</TextBlock>
            <Slider Grid.Column="1"
                x:Name="MySlider2" 
                VerticalAlignment="Top" 
                Minimum="10" 
                Maximum="300" 
                Value="150" 
                Margin="10" />
        </Grid>

        <Grid>
            <Rectangle x:Name="rechteck"          
            Width="300" 
            Height="300"
            Margin="{Binding ElementName=MySlider2, Path=Value}"
            Fill="black"
            VerticalAlignment="Center"
            HorizontalAlignment="Center" />
        </Grid>
    </Grid>
</Window>

顶部/底部兰特
兰德左/右

在WPF中,控件将填充给定的空间。在您的例子中,您为这个
矩形指定了一个300x300的显式大小。边距是减少控件大小的内部填充。当您重新调整并收缩
窗口时,
矩形将重新调整大小以适应其新的给定边界


如果希望无论窗口大小如何调整,
矩形的大小保持不变,我建议直接将
绑定到
高度
宽度
属性,而不是
边距
。此外,目前看起来您甚至没有使用MySlider,而只使用MySlider2

首先在某处添加转换器

public class IntToThicknessConvertor : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return new Thickness((double)values[0], (double)values[1], (double)values[2], (double)values[3]);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        Thickness t = (Thickness)value;
        return new object[]{t.Left,t.Top,t.Right,t.Bottom};
    }
}
在xaml中,创建一个指向转换器的资源:

<Window.Resources>
    <local:IntToThicknessConvertor x:Key="theIntToThicknessConvertor"/>
</Window.Resources>

然后在矩形中实现多重绑定:

        <Rectangle x:Name="rechteck"          
                    Width="300" 
                    Height="300"               
                    Fill="black"
                    VerticalAlignment="Center"
                    HorizontalAlignment="Center" >
            <Rectangle.Margin>
                <MultiBinding Converter="{StaticResource theIntToThicknessConvertor}">
                    <Binding ElementName="MySlider" Path="Value"/>
                    <Binding ElementName="MySlider2" Path="Value"/>
                    <Binding ElementName="MySlider" Path="Value"/>
                    <Binding ElementName="MySlider2" Path="Value"/>
                </MultiBinding>
            </Rectangle.Margin>
        </Rectangle>


您可能需要做更多的工作,但我希望这会让您走上正确的道路,如果您希望在调整
窗口大小时
矩形保持大小,那么就不要绑定
边距
并保持
宽度
高度
固定,而是将它们绑定到适当的位置
滑块

<Rectangle 
    x:Name="rechteck"          
    Width="{Binding ElementName=MySlider2, Path=Value}"
    Height="{Binding ElementName=MySlider, Path=Value}"
    Fill="black"
    VerticalAlignment="Center"
    HorizontalAlignment="Center"/>
public class MarginConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return new Thickness((double)values[0], (double)values[1], (double)values[0], (double)values[1]);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
并按如下方式更改您的
网格

<Window ... xmlns:local="clr-namespace:Namespace.For.MarginConverter">
    <Grid>
        <Grid.Resources>
            <local:MarginConverter x:Key="MarginConverter"/>
        </Grid.Resources>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="50*"/>
            <ColumnDefinition Width="50*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <TextBlock Grid.Column="0" HorizontalAlignment="Center">Rand top/bottom</TextBlock>
        <Slider Grid.Column="0"
              x:Name="MySlider" 
              VerticalAlignment="Top" 
              Minimum="10" 
              Maximum="300" 
              Value="150" 
              Margin="10" />

        <TextBlock Grid.Column="1" HorizontalAlignment="Center">Rand left/right</TextBlock>
        <Slider Grid.Column="1"
                x:Name="MySlider2" 
                VerticalAlignment="Top" 
                Minimum="10" 
                Maximum="300" 
                Value="150" 
                Margin="10" />
        <Rectangle Grid.Row="1" Grid.ColumnSpan="2" x:Name="rechteck" Fill="black">
            <Rectangle.Margin>
                <MultiBinding Converter="{StaticResource MarginConverter}">
                    <Binding ElementName="MySlider2" Path="Value"/>
                    <Binding ElementName="MySlider" Path="Value"/>
                </MultiBinding>
            </Rectangle.Margin>
        </Rectangle>
    </Grid>
</Window>

顶部/底部兰特
兰德左/右

我把
矩形
放在同一
网格
的底行,该网格有
滑块
,否则当边距接近0时,它可能会覆盖控件

如果您想使其变大/变小,将
矩形
宽度
高度
绑定到每一个网格是否会更容易滑块而不是使用
边距
。嘿,我回答了他的问题,但不是他真正的需要。回答得很好。这是一个问题,我已经知道这是可能的,但这不是我想要的,因为如果你调整窗口大小,矩形没有调整,这就是为什么我要绑定边框。这与你在问题中所说的“如果你改变窗口大小,矩形正在调整”相矛盾现在你说这个解决方案是错误的,因为“如果你调整窗口的大小,矩形就不会调整”。那你想要什么呢?对不起,我的英语不好,我的意思是说我想说的,而不是现在的工作方式。因此,如果我调整大小,我希望矩形可以调整窗口。非常感谢,这正是我想要的。:)我应该写什么而不是写本地的?对于这些问题,我很抱歉。在您的窗口标签中,您应该添加类似于
xmlns:local=“clr namespace:YourProjectsNameSpaceHere”
的内容,但您可能应该使用@dkozl的答案。