2012-04-03 7 views
7

Я создал UserControl следующим образом:Доступ элементы пользовательского элемента управления

<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> 

Теперь, с моей главной странице я хочу, чтобы изменить текст появляется в моем User Control с «Sample» к Hello World. Итак, я сделал это в моем MainPage.xaml

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

И в mainpage.xaml.cpp, когда я пытаюсь ссылаться MyControl, кажется, непризнанные:

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

Любая идея?

ответ

10

Дополнительная информация @Steven. Вы ответите в своем UserControl: DependencyProperty. Определение DependencyProperty позволяет получать уведомления об изменениях для запуска обновлений для ваших элементов управления.

В коде вашего UserControl вы можете добавить свойство зависимости.

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; 
    } 
} 

Это подвергает публичной DependencyProperty которые можно связать в XAML вашего UserControl в.

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

Теперь вам нужен способ установить это свойство из окна управления окном. Я подробно три способа, которыми вы можете сделать это:

1.) Поскольку свойство TextBlockText выставляется на UserControl мы можем установить его непосредственно в XAML как:

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

2.) Если мы даем UserControl имя мы можем изменить свойство в окне кода-позади:

<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.) Или, наконец, вы можете создать еще DependencyProperty в коде кода Window и привязать его к свойству зависимости UserControl. Таким образом, всякий раз, когда вы обновляете свойство, значение в вашем коде Window также изменит свойство зависимостей UserControl. Это предпочтительный выбор, как @Steven, о котором вы говорили раньше, поскольку ваш код не должен знать о каких-либо элементах управления.

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."; 
    } 
} 

И связываться с нашим новым DependencyProperty в окне XAML:

<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> 

Надеется, что это помогает!

1

В представлении программы лучший способ сделать это - использовать привязку данных, а не устанавливать значение в коде позади. Чтобы решить эту проблему, самый простой способ - зарегистрировать свойство зависимостей UserControl привязать это значение к TextBlock, а затем установить значение в MainPage.

+0

можете ли вы дать небольшой пример о том, как это сделать? –

+0

Читайте это: http: //www.codeproject.com/Articles/224230/Изучение использования зависимостей-свойств-в-пользователе –

+0

Посмотрите на эту привязку данных [пример] (http://code.msdn.microsoft.com/windowsapps/Data-Binding- 7b1d67b5) –

Смежные вопросы

 Смежные вопросы