Canvas.Left-Eigenschaft im Code dahinter ändern?

97

Ich habe ein Rechteck in meiner XAML und möchte seine Canvas.LeftEigenschaft im Code dahinter ändern :

<UserControl x:Class="Second90.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300" KeyDown="txt_KeyDown">
    <Canvas>
        <Rectangle 
            Name="theObject" 
            Canvas.Top="20" 
            Canvas.Left="20" 
            Width="10" 
            Height="10" 
            Fill="Gray"/>
    </Canvas>
</UserControl>

Das funktioniert aber nicht:

private void txt_KeyDown(object sender, KeyEventArgs e)
{
    theObject.Canvas.Left = 50;
}

Weiß jemand, wie die Syntax dazu lautet?

Edward Tanguay
quelle

Antworten:

164
Canvas.SetLeft(theObject, 50)

AnthonyWJones
quelle
+1, ich muss Typensicherheit lieben. Ich bin allerdings neugierig, warum SetLeft ein UIElement anstelle eines DependencyObject
JaredPar
4
@JaredPar: Vermutlich würde SetLeft, da es sich speziell um eine Canvas-Methode handelt, verstehen, welchen Typen es sinnvoll wäre, eine Left-Eigenschaft zuzuweisen. Dies wird als UIElement angesehen. Dies erhöht möglicherweise die Erkennung von fehlerhaftem Code, wenn versehentlich die falsche Variable an ihn übergeben wird.
AnthonyWJones
msdn.microsoft.com/en-us/library/… Canvas.Left ist eine angehängte Eigenschaft, die eine XAML-Verwendung unterstützt. Verwenden Sie stattdessen SetLeft, wenn Sie diese Eigenschaft im Code festlegen.
Yury Schkatula
50

Versuche dies

theObject.SetValue(Canvas.LeftProperty, 50d);

Auf DependencyObject (Basis der meisten WPF-Klassen) gibt es eine Gruppe von Methoden, die den gemeinsamen Zugriff auf alle Abhängigkeitseigenschaften ermöglichen. Sie sind

  • SetValue
  • Wert erhalten
  • ClearValue

Bearbeiten Der Satz wurde aktualisiert, um ein doppeltes Literal zu verwenden, da der Zieltyp ein doppeltes ist.

JaredPar
quelle
Danke, damit dies funktioniert, musste ich die ganze Zahl umwandeln: theObject.SetValue (Canvas.LeftProperty, (double) 50);
Edward Tanguay
Nein, geben Sie hierfür eine numerische Konstante im Doppelformat an: heObject.SetValue (Canvas.LeftProperty, 50.0);
Budda
12

Da wir die Eigenschaft des 'Objekts' ändern, ist es besser, die von JaredPar vorgeschlagene Methode zu verwenden:

theObject.SetValue(Canvas.LeftProperty, 50d);
Budda
quelle