2012-04-03 17 views
7

ich ein Usercontrol erstellt haben, wie folgt:Zugriff auf Elemente eines User Control

<UserControl 
x:Class="MySample.MyControl" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:MySample" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DesignHeight="300" 
d:DesignWidth="400"> 

<Canvas> 

    <Ellipse Width="150" Height="150"/> 

    <TextBlock>Sample</TextBlock> 

</Canvas> 

nun von meinem Haupt-Seite würde ich wollen, dass der Text zu ändern, von „Probe“ in meinem User Control erscheinen zu Hallo Welt. Also, ich habe dies in meiner MainPage.xaml

<local:MyControl x:Name="MyControl" Margin="100,50 0,0"></local:MyControl> 

Und im mainpage.xaml.cpp, wenn ich versuche MyControl zu verweisen, scheint es nicht erkannt:

MainPage::MainPage(){MyControl->Text = "Hello World";} 

Jede Idee?

Antwort

10

Detaillierung @Steven Sie beantworten, in Ihrem UserControl definieren Sie eine DependencyProperty. Wenn Sie DependencyProperty definieren, können Änderungsbenachrichtigungen Aktualisierungen für Ihre Steuerelemente auslösen.

Im Code-Behind Ihres Benutzersteuerelements können Sie die Abhängigkeitseigenschaft hinzufügen.

public partial class MyUserControl : UserControl 
{ 
    public string TextBlockText 
    { 
     get { return (string)GetValue(TextBlockTextProperty); } 
     set { SetValue(TextBlockTextProperty, value); } 
    } 

    public static readonly DependencyProperty TextBlockTextProperty = 
     DependencyProperty.Register("TextBlockText", typeof(string), typeof(MyUserControl), new UIPropertyMetadata("")); 


    public MyUserControl() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 
} 

Dies setzt eine öffentliche DependencyProperty, die Sie in Ihrem Usercontrol XAML binden können.

<UserControl> 
     <TextBlock Text="{Binding Path=TextBlockText}" /> 
</UserControl> 

Jetzt brauchen Sie einen Weg, um diese Eigenschaft von Ihrem Fenster-Steuerelement zu setzen. Ich werde Detail drei Möglichkeiten, in denen Sie dies tun:

1.) Da die TextBlockText Eigenschaft auf dem Usercontrol ausgesetzt ist, können wir es direkt in der XAML festlegen wie:

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns:local="clr-namespace:WpfApplication2"> 
    <local:MyUserControl TextBlockText="Text that you want to set."> 
    </local:MyUserControl> 
</Window> 

2.) Wenn wir geben dem Usercontrol einen Namen wir das Objekt im Fenster Code-Behind ändern können:

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns:local="clr-namespace:WpfApplication2"> 
    <local:MyUserControl Name="CoolUserControl"> 
    </local:MyUserControl> 
</Window> 

-

CoolUserControl.TextBlockText = "Text that you want to set."; 

3.) Oder schließlich können Sie eine andere DependencyProperty innerhalb Ihrer Window 's Code-behind und binden Sie es an die UserControl' s Abhängigkeitseigenschaft. Auf diese Weise ändert sich bei jeder Aktualisierung der Eigenschaft der Wert in Ihrem Window Code die UserControl Abhängigkeitseigenschaft ebenfalls. Dies ist die bevorzugte Wahl als @Steven, die Sie zuvor gesagt haben, da Ihr Code hinter nichts über irgendwelche Kontrollen wissen muss.

public partial class MainWindow : Window 
{ 

    public string UserControlText 
    { 
     get { return (string)GetValue(UserControlTextProperty); } 
     set { SetValue(UserControlTextProperty, value); } 
    } 

    public static readonly DependencyProperty UserControlTextProperty = 
     DependencyProperty.Register("UserControlText", typeof(string), typeof(MainWindow), new UIPropertyMetadata("")); 


    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = this; 
     UserControlText = "Text that you want to set."; 
    } 
} 

Und zu unserem neuen DependencyProperty im Fenster XAML zu binden:

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns:local="clr-namespace:WpfApplication2"> 
    <local:MyUserControl TextBlockText="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}, Mode=FindAncestor}, Path=UserControlText}"></local:MyUserControl> 
</Window> 

hoffe, das hilft!

1

In der Programmansicht verwenden Sie die Datenbindung am besten, anstatt den Wert im Code festzulegen. Um dieses Problem zu lösen, ist die einfachste Möglichkeit, eine Abhängigkeitseigenschaft des UserControl zu registrieren, binden Sie diesen Wert an den TextBlock und legen Sie den Wert in MainPage fest.

+0

Können Sie ein kleines Beispiel dafür geben? –

+0

Lesen Sie dies: http: //www.codeproject.com/Articles/224230/Exploring-the-Verwendung-der-Abhängigkeit-Eigenschaften-im-Benutzer –

+0

Werfen Sie einen Blick auf diese Datenbindung [Beispiel] (http://code.msdn.microsoft.com/windowsapps/Data-Binding- 7b1d67b5) –