views:

232

answers:

1

I need a rectangle in my settings window to display a scaled down version of of the main window. This is the non-working code that I have right now. Is it possible to do what I want to do?

<Rectangle.Fill>
<VisualBrush Stretch="Uniform" Visual="{Binding ElementName=local:MainWindow}" />
</Rectangle.Fill>
+2  A: 

Yes, but not in pure XAML and not using ElementName. Instead, you'll need to pass a reference to the main window into your settings window. You can then bind the VisualBrush.Visual to that reference.

As a simplified example, when creating your settings window, you could set its DataContext to the main window:

// MainWindow.xaml.cs
SettingsWindow w = new SettingsWindow { DataContext = this };
w.Show();

Then the SettingsWindow you could access the MainWindow as {Binding} (because the MainWindow is now the SettingsWindow's DataContext, and {Binding} refers to the DataContext):

<!-- SettingsWindow.xaml -->
<Rectangle.Fill>
  <VisualBrush Stretch="Uniform" Visual="{Binding}" />
</Rectangle.Fill>

In practice you probably won't want to pass the main window object as the DataContext because that's too blunt an instrument, but hopefully this gives you the idea.

itowlson
Noob question, but what do you mean by "you probably won't want to pass the main window object as the DataContext because that's too blunt an instrument"? What should I pass?
Justin
The problem is that if you set the DataContext to the MainWindow, you can't set anything else as the DataContext. Specifically, since your Settings window probably wants to be binding to some kind of settings object, you'll probably want the settings object to be the DataContext... or at least part of the DataContext. The idiomatic solution in WPF is to create a "view model" class that contains all the info needed for the view (in this case the MainWindow visual and the settings object(s)), and set the DataContext to this "view model." Hope that makes a bit more sense now!
itowlson
It does. Thank you very much!
Justin