Доступ к элементам пользовательского элемента управления - PullRequest
8 голосов
/ 03 апреля 2012

Я создал 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>

Теперь с моей главной страницы я бы хотел изменить текст, отображаемый в моем пользовательском элементе управления, с «Образца» на Hello World. Итак, я сделал это на моей главной странице. Xaml

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

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

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

Есть идеи?

Ответы [ 2 ]

13 голосов
/ 03 апреля 2012

Детализация ответа @Steven You, в вашем 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>

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

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 в Window 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 голос
/ 03 апреля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...