2016-11-18 6 views
2

Я хочу присоединиться к владельцу вылета, который я создал.Как получить доступ к программно созданному вылету?

У меня есть код:

public void dosomething(Grid lessonGrid) 
{ 
    var invisibleButton = new Button(); 
    lessonGrid.Children.Add(invisibleButton); 

    var contentGrid = new Grid() 

    var buttonInFlyOut = new Button { Content="Click" }; 
    buttonInFlyOut.Click += buttonClicked; 

    contentGrid.Children.Add(buttonInFlyOut); 

    var flyout = new FlyoutForLessons { 
     Content = contentGrid 
    }; 

    flyout.Closed += (f, h) => 
    { 
     lessonGrid.Children.Remove(invisibleButton); 
    }; 

    flyout.Owner = lessonGrid; 
    flyout.ShowAt(invisibleButton); // i want to acces a owner from parent of invisible Button -> lessonGrid 
} 

private class FlyoutForLessons : Flyout 
{ 
    private static readonly DependencyProperty OwnerOfThisFlyOutProperty = DependencyProperty.Register(
     "owner", typeof(UIElement), typeof(FlyoutForLessons), 
     null); 

    public UIElement Owner 
    { 
     get { return (UIElement) GetValue(OwnerOfThisFlyOutProperty); } 
     set { SetValue(OwnerOfThisFlyOutProperty, value); } 
    } 

} 

Этот код показывает мне выпадающую. Поэтому, когда я нажимаю кнопку «buttonInFlyOut» я хочу, чтобы получить идентификатор «lessonGrid» от отправителя в этом методе:

private void buttonClicked_Click(object sender, RoutedEventArgs e) 
    { 

    } 

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

Если живое дерево помогает:

live tree image of flyout

ответ

3

Там нет причин, почему вы не могли обрабатывать ваши события щелчка, как это:

public void DoSomething(Grid lessonGrid) 
    { 
     var invisibleButton = new Button(); 
     lessonGrid.Children.Add(invisibleButton); 

     var contentGrid = new Grid(); 

     var buttonInFlyOut = new Button { Content = "Click" }; 
     buttonInFlyOut.Click += (o, args) => 
      { 
       this.OnButtonClicked(lessonGrid); 
      }; 

     contentGrid.Children.Add(buttonInFlyOut); 

     var flyout = new Flyout { Content = contentGrid }; 

     flyout.Closed += (f, h) => { lessonGrid.Children.Remove(invisibleButton); }; 

     flyout.ShowAt(invisibleButton); // i want to acces a owner from parent of invisible Button -> lessonGrid 
    } 

    private void OnButtonClicked(Grid lessonGrid) 
    { 
     // Do something here 
    } 

Это позволяет получить доступ к сетке, что вам передается методу.

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

+1

oh! Спасибо, это то, что мне просто нужно: D Эта проблема заблокировала меня, чтобы пойти дальше Решение этой проблемы было настолько простым :) – Niewidzialny

+1

@Niewidzialny, что не проблема. Я рад, что смогу помочь! –

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