Window1.xamlにまったく別の場所で定義されているWindow2.xamlのGridをプラスする例。
NameScopeを設定しないと、FindName("button100")でnullが返る。
この方法が、アプリの動的ページ切替えの基本。


using System;
using System.IO;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Navigation;
using System.Windows.Markup;
namespace gridchange
{
public partial class Window1
{
public Window1()
{
this.InitializeComponent();
}

private void OnClick(object sender, RoutedEventArgs e)
{
System.Net.WebClient client = new WebClient();
Byte [] data = client.DownloadData( "http://localhost/Window2.xaml" );
MemoryStream st = new MemoryStream( data );
Window wnd = (Window)XamlReader.Load( st );

Grid grid1 = (Grid)wnd.FindName("topgrid1");
((Grid)grid1.Parent).Children.Remove(grid1); // Window2.xaml内のtopgrid1を取る

wnd.Close();
st.Close();
client.Dispose();

// -----------------------------------------------------------------------

Grid root = (Grid)this.FindName("LayoutRoot");

root.Children.Add(grid1); // 取ったtopgrid1をWindow1.xaml(=this)にはり付ける


// topgrid1下のすべてのオブジェクトの名前をNameScopeで設定

NameScope ns = new NameScope();
for( int i = 0; i < grid1.Children.Count; i++ )
{
if ( typeof( FrameworkElement).IsInstanceOfType( grid1.Children[i]) )
{
FrameworkElement fele = (FrameworkElement)grid1.Children[i];
ns.RegisterName( fele.Name, fele );
}
}
ns.RegisterName( grid1.Name, grid1 );
NameScope.SetNameScope(this, ns );


Button btn = (Button)root.FindName("button100"); // topgrid1内で定義されているButton
btn.Click += delegate(object sender1, RoutedEventArgs e1)
{
MessageBox.Show( "ok" );

};
}


}
}