2010-06-29 2 views
0

У меня есть UserControl, который выглядит следующим образом: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> 

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

ответ

1

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

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

Есть несколько решений:

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

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

0

Самый простой способ сделать то, что вы описываете, чтобы воспользоваться преимуществами маршрутизации событий и просто добавить обработчик в окне 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"; 
} 

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

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