我想通过复选框激活转换。
在我的示例中,我有两个复选框,它们应分别在x或y方向交换标签中的文本。
这可能没有代码吗?
到目前为止,这是我的xaml:
<Window x:Class="WpfVideoTest.InversionTestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="InversionTestWindow" Height="300" Width="300">
<DockPanel>
<CheckBox DockPanel.Dock="Bottom" IsChecked="{Binding InvertX}">Invert X</CheckBox>
<CheckBox DockPanel.Dock="Bottom" IsChecked="{Binding InvertY}">Invert Y</CheckBox>
<Label Content="Text to invert" FontSize="40" x:Name="TextToInvert">
<Label.RenderTransform>
<TransformGroup>
<!-- transformations to swap in x direction -->
<ScaleTransform ScaleX="-1" />
<TranslateTransform X="{Binding ActualWidth, ElementName=TextToInvert}" />
<!-- transformations to swap in y direction -->
<ScaleTransform ScaleY="-1" />
<TranslateTransform Y="{Binding ActualHeight, ElementName=TextToInvert}" />
</TransformGroup>
</Label.RenderTransform>
</Label>
</DockPanel>
答案 0 :(得分:1)
您需要使用Converter或MultiConverter。是的,它是代码,但它是有序的方式代码被添加到WPF中的绑定。从概念上讲,您希望应用于转换的值依赖于某个其他值,并且转换类本身不具有该功能。
这就是转换器的样子。它期望三个值,其中第一个是bool。
public class TernaryConditionalMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values.Length >= 3 && values[0] is bool)
{
return (bool)values[0] ? values[1] : values[2];
}
return null;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
你会这样使用它:
<ScaleTransform>
<ScaleTransform.ScaleX>
<MultiBinding Converter="{StaticResource TernaryConditionalConverter}">
<Binding Path="InvertX" />
<Binding Source="{StaticResource PositiveOne}" />
<Binding Source="{StaticResource NegativeOne}" />
</MultiBinding>
</ScaleTransform.ScaleX>
</ScaleTransform>
其中PositiveOne和NegativeOne已在某处定义为资源,例如:
<sys:Double x:Key="PositiveOne">1</sys:Double>