現在、1 つのメイン ウィンドウと、このウィンドウの子である多くの UserControls を持つ WPF プロジェクトがあります。このウィンドウの子の多くはタブです。メイン ウィンドウを、メイン ウィンドウとほぼ同じ機能を実装するユーザー コントロールに置き換えることに成功しました。
Window を UserControl に置き換えると、1 つの問題が発生しました。現在、アプリケーションは、以下に示す方法を使用して、親ウィンドウに基づいて表示するプログラミング タブを決定しWindow.FindName
ます。Application.Current.MainWindow
したがって、メイン ユーザー コントロールの適切な説明に置き換える必要があります。明確にするために、以下のエラーのある C# メソッドと、タブの wpf インスタンス化を参照してください。
Window.FindName() メソッドに関する注意- UserControl に置き換えた後に機能しない理由は、ここで説明されているように、FindName メソッドがビジュアル ツリーを上方向に検索するためです。
のように、x:Name に基づいてユーザー コントロールを見つける方法を知っている人はいますApplication.Current.MainWindow
か? また、名前が変更された場合に x:Name 文字列を探すよりも、UserControl を見つけるためのより良い方法はありますか?
現在 MainWindow を見つける方法 - MainUserControl を見つける必要があります。
(C#)
private static void SetCurrentProgram(int num)
{
Window window = Application.Current.MainWindow;
ProgrammingTab programmingTab1 = window.FindName("ProgrammingTab1") as ProgrammingTab;
ProgrammingTab programmingTab2 = window.FindName("ProgrammingTab2") as ProgrammingTab;
programmingTab1.Visibility = num == 1 ? Visibility.Visible : Visibility.Collapsed;
programmingTab2.Visibility = num == 2 ? Visibility.Visible : Visibility.Collapsed;
}
プログラミング タブのインスタンス化。
(xaml)
<Grid>
<ProgrammingControl:ProgrammingTab x:Name="ProgrammingTab1" Program="1" IsVisibleChanged="ProgrammingTab_IsVisibleChanged" />
<ProgrammingControl:ProgrammingTab x:Name="ProgrammingTab2" Program="2" IsVisibleChanged="ProgrammingTab_IsVisibleChanged" />
</Grid>