UserControl вызывает методы и использует переменные вне своего класса - PullRequest
0 голосов
/ 30 июня 2010

У меня есть UserControl, который выглядит так:

<UserControl x:Class="Test3.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Button Name="mybutton" Content="Button Content"/>
    </Grid>
</UserControl>

И главное окно, которое использует его так:

<Window Name="window_main" x:Class="Test3.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Test3">

    <StackPanel>
        <Label Name="mylabel" Content="Old Content"/>
        <local:UserControl1/>
    </StackPanel>
</Window>

Я хочу, чтобы обработчик события click для mybutton установил для содержимого mylabel значение «Новое содержимое». Однако, похоже, что это невозможно. Есть ли на самом деле способ сделать это?

Ответы [ 3 ]

1 голос
/ 01 июля 2010

Я решил ответить на это сам, так как мое решение оказалось немного более полным.Я не совсем понимаю «правильный» способ сделать это, но вот как я это сделал:

Window1 window_reference = (Window1)(Window1.GetWindow((Button)sender));

После этого дочерние элементы (такие как другие элементы управления xaml) главного окна могут бытьзамечено во время компиляции.

Кроме того, более прямой способ сделать это состоит в том, чтобы иметь открытый член UserControl, например, так:

namespace UIDD_Test
{
    public partial class UserControl1 : UserControl
    {
        public Window1 window_reference;

        public UserControl1()
        {
            InitializeComponent();
        }
    }
}

Затем, при необходимости, вы можете установитьчлен ссылаться на любое окно, которое вы хотите.В моем случае у меня есть класс Window1, производный от Window, поэтому я могу установить этот член класса UserControl1 следующим образом:

myusercontrol.window_reference = window_main;

Где я установил xamlвот так:

<local:UserControl1 x:Name="myusercontrol"/>

И window_main - это имя главного окна (это класс Window1).

0 голосов
/ 30 июня 2010

Самый простой способ сделать то, что вы описываете, - воспользоваться преимуществами маршрутизации событий и просто добавить обработчик в Window XAML:

<StackPanel ButtonBase.Click="Button_Click">
    <Label Name="mylabel" Content="Old Content"/>
    <local:UserControl1/>
</StackPanel>

и метод обработчика:

private void Button_Click(object sender, RoutedEventArgs e)
{
    mylabel.Content = "New Content";
}

Я подозреваю, что у вас, вероятно, есть некоторые сложности с этим в вашем реальном приложении, поэтому вам может потребоваться сделать больше, чтобы убедиться, что щелчок исходит от правильной кнопки, проверив некоторые свойства на ней.

0 голосов
/ 30 июня 2010

Существует несколько решений:

Быстрое и грязное: на обработчике событий щелчка mybutton найдите родителя Window с помощью VisualTreeHelper, затем выполните ((Label) window.FindName("mylabel")).Content = "New Content".

Чистый способ WPF: создайте новый класс, добавьте свойство object LabelContent и свойство ICommand ChangeContentCommand, которое изменит LabelContent при выполнении.Установите этот класс как DataContext окна, свяжите Content из mylabel с LabelContent и свойством Command mybutton с ChangeContentCommand (пользовательский элемент управления унаследует контекст данных).

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