Ich habe zwei Textfelder, in denen die Position von etwas auf einer Leinwand angegeben ist. Ich möchte nur, dass die Werte in den Textfeldern eine Zahl im Bereich von 0 bis 1 sind, die einen Prozentsatz der Breite / Höhe darstellt.
Ich muss einige, wie dieser Prozentsatz in Margin-Wert umgerechnet wird. Ich bin mir jedoch nicht sicher, wie ich dies tun soll, ohne das MVVM-Muster zu brechen und über das ViewModel auf die "Zeichenfläche" zuzugreifen, um deren Größe zu ermitteln.
Wenn zum Beispiel die Leinwand 100 breit und die X-Position 0,1 ist, muss der linke Rand 10 sein.
Ich habe darüber nachgedacht, einen Befehl zu verwenden und die Zeichenfläche width / height als Ereignisargument zu senden, bin mir aber nicht sicher, wohin ich das binden würde.
XAML
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" Text="Position" Width="75"/>
<TextBox Height="25" Width="50"
Text="{Binding Path=X, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Height="25" Width="50"
Text="{Binding Path=Y, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
<Grid Height="300" Width="550">
<TextBlock FontSize="18" FontFamily="Arial"
Opacity="{Binding Path=Opacity}"
Margin="{Binding Position}">
</TextBlock>
</Grid>
ViewModel
public double X
{
get { return Model.Position.X; }
set
{
if (Model.Position.X != value)
{
Model.Position = new Point(value, Model.Position.Y);
OnPropertyChanged("Position");
}
}
}
public double Y
{
get { return Model.Position.Y; }
set
{
if(Model.Position.Y != value)
{
Model.Position = new Point(Model.Position.X, value);
OnPropertyChanged("Position");
}
}
}
public Thickness Position
{
get { return new Thickness(Model.Position.X, Model.Position.Y, 0, 0); }
}
Die Lösung bestand darin MultiBinding
, die erforderlichen Informationen als Werte zu senden:
<Setter Property="Margin">
<Setter.Value>
<MultiBinding Converter="{StaticResource MyMultiConverter}">
<Binding Path="X"/>
<Binding Path="Y"/>
<Binding ElementName="Canvas" Path="ActualWidth"/>
<Binding ElementName="Canvas" Path="ActualHeight"/>
</MultiBinding>
</Setter.Value>
</Setter>
MyMultiConverter implementiert dann a IMultiValueConverter
und gibt es zurückThickness
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen