C# 如何将矩形的边距绑定到上/下和左/右的两个滑块
我正在尝试制作一个wpf程序,其中包含一个矩形,顶部有两个滑块: 第一个滑块更改矩形的左/右边距,右滑块更改上/下边距,因此看起来矩形越来越大越来越小。但是,如果更改窗口大小,矩形将进行调整 这是我的密码: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
<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的答案。