Эй, я делаю Приложение WPF.
Дерево похоже на это:
SurfaceWindow---Startscreen
..........................--------Страница----------Подстраница
Я пытаюсь назвать метод от "Подстраницы" из "Кода Позади" Startscreen(Startscreen.xaml.cs).
Метод от Подстраницы похож на это:
общественность освобождает showTheme (тема ThemeViewModel) {...}
Если знают, что я могу назвать его, когда я нахожусь на "Странице" или "SurfaceWindow", потому что это находится в том же "ответвлении" дерева, и я просто делаю что-то вроде этого:
ThemeViewModel theme = (ThemeViewModel)mvm.CurrentItem.ThemeViewModel;
katalog.katalogblatt.showTheme(theme);
Но как я делаю это, когда я не нахожусь на том же ответвлении дерева и хочу назвать метод?
Не могли бы вы предоставить более подробную информацию? ваша терминология может означать разные вещи. Если вы имеете в виду, что хотите вызвать метод под названием 'showTheme' в элементе управления с именем 'katalogBlatt' вне родительского элемента управления, вам либо нужно предоставить метод родительского элемента для вызова метода дочерних элементов управления:
public void ShowTheme(ThemeViewModel theme)
{
this.katalogBlatt.ShowTheme(theme)
}
и вызвать его как :
page.ShowTheme(theme)
или вам нужно предоставить элемент управления как общедоступное свойство для родительского объекта:
public <controlType> Catalog
{
get
{
return katalogBlatt;
}
}
и называть его так:
page.Catalog.ShowTheme(theme);
Я поддержу комментарий J Rothe о том, что ваша терминология сбивает с толку. Однако я также сделаю попытку.
Мне кажется, что вы хотите, чтобы какое-то событие на вашем "StartScreen" вызывало метод на вашей "Subpage". В связи с этим возникает вопрос, что делать, если есть несколько "подстраниц". Предположим, что вы хотите вызвать их все.
Техника, которую я бы рекомендовал, заключается в том, чтобы ваша "подстраница" связывалась с некоторыми глобальными данными, чтобы узнать, какое представление она должна показывать в каждый момент времени. Я вообще предпочитаю привязку к данным, поэтому сначала покажу этот способ.
Самый простой способ сделать это с помощью привязки данных - иметь свойство в вашем объекте Application (или другом статическом объекте), которое является текущей темой. Вместо того чтобы вызывать subpage.ShowTheme(), любой код, изменяющий тему, просто обновляет свойство theme:
MyApp.Current.Theme = theme;
Теперь Subpage может использовать связывание данных для получения темы, привязанной к одному из ее собственных свойств в стиле по умолчанию:
<Style TargetType="my:Subpage">
<Setter Property="Theme" Value="{Binding Theme, Source={x:Static my:MyApp.Current}}" />
</Style>
В определении для свойства Theme Subpage используйте PropertyChangedCallback для обновления представления:
public static readonly DependencyProperty ThemeProperty = DependencyProperty.Register("Theme", typeof(MyTheme), typeof(Subpage), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
((Subpage)obj).SetTheme((Theme)e.NewValue);
}
});
В общем, это лучший способ для таких вещей, как изменение представления, но иногда вы хотите распространять события. Обычно это делается с помощью команд вроде этой:
command.Execute(null, Keyboard.FocusedElement);
Но это работает, только если фокус установлен где-то внутри цели. В вашем случае вы хотите послать команду определенному окну. Если у вас только один элемент управления Subpage, он может подписаться на событие в объекте приложения:
public Subpage()
{
MyApp.Current.SwitchTheme += (obj, e) => setTheme(e.NewTheme);
}
и события изменения темы будут:
MyApp.Current.SwitchTheme(null, new ThemeChangeEventArgs { NewTheme = theme });
Опять же, если это возможно, я бы использовал технику связывания данных.